当前位置: 首页 > 知识库问答 >
问题:

Spring批处理:如何启动作业但不执行,而是在其他java实例中执行

冯鸿光
2023-03-14

我计划使用Spring Batch。我们喜欢在响应前端请求的POD中启动新作业执行。

代码:

@PostMapping(path = "/request-report/{id}")
public void requestReport(String id){
  this.jobOperator.start("reportJob", new Properties("1"));
}

但我们不希望作业在前端pod中执行。为此,我们希望构建一个单独的微服务吊舱。

我看到了以下解决方案:

>

  • 从前端pod到sping-batpod执行一个rest调用并在那里开始工作。我可以这样做,但如果可能的话,我想跳过该步骤并将其集成到sping-batdb上。

    在前端pod中,我创建了具有大小为零的SimpleAsyncTaskExecutor的JobLauncher。所以它永远不会执行作业。

    https://docs.spring.io/spring-batch/docs/current/reference/html/job.html#configuringJobLauncher

    @Bean
    public JobLauncher jobLauncher() {
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(jobRepository());
        jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
        jobLauncher.afterPropertiesSet();
        return jobLauncher;
    }
    

    我想我还必须编写一些软件来扫描作业表并检查是否存在未启动的作业,并且start再次出现在sping-batch-pod中。

    谢谢你的帮助!

  • 共有1个答案

    汪高岑
    2023-03-14

    如果您使用SimpleAsyncTaskExector配置作业启动器,它将在同一JVM中的不同线程中启动作业(因此在同一容器和pod中)。

    因此,除非您提供一个自定义的TaskExecutor来在单独的JVM/container/pod中启动作业,否则您需要更改您的体系结构以使用作业队列。通过参考文档中的消息启动批处理作业一节显示了如何设置这种模式。

     类似资料:
    • 我的spring批处理应用程序运行在连接到MySQL数据库(单实例)的PCF平台上,只有一个实例启动时运行良好

    • 我遵循了spring批处理文档,无法异步运行我的作业。 因此,我从一个web容器运行该作业,该作业将通过RESTendpoint触发。 我想让JobInstance ID在完成整个作业之前传递它作为响应。因此,他们可以稍后使用JobInstance ID检查作业的状态,而不是等待。但我没能让它工作。下面是我尝试过的示例代码。请让我知道我错过了什么或错了什么。 BatchConfig创建异步JobL

    • 我们需要执行从一个数据库到其他数据库的数据移动,并为此探索spring batch。我们应用程序的用户选择源数据源和目标数据源,以及需要为其移动数据的表列表。 在以下方面需要帮助: 构建作业所需的信息在运行时来自我们的web应用程序-包括数据源详细信息和表名列表。我们希望通过将这些详细信息发送到job builder模块来创建一个新作业,并使用JobLauncher启动它。我们如何编写这个job

    • 我正在尝试修复Spring Batch中的一个问题,这个问题最近一直困扰着我们的系统。我们有一份工作,在大多数情况下都很好。下载和处理数据是一个多步骤的工作。 问题是有时工作会爆棚。也许我们试图连接到的服务器抛出了错误,或者我们在工作进行到一半时关闭了服务器。此时,下次我们的quartz调度程序尝试运行该作业时,它似乎什么也不做。以下是此作业定义的删节版本: 委婉地说,我是Spring Batch