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

在第一个作业执行完毕后运行第二个批处理作业

左丘烨烁
2023-03-14

我想一个接一个地运行两个工作。是的,我确实在网上搜索过,但他们有解决方案,包括在第一份工作中增加第二份工作。但我有不同的要求。我会在第一批作业执行完成后得到一个通知,而第二批作业只有在收到这个通知后才会运行。是否有可能在Spring Boot中一个接一个地运行两个作业。请救命!

共有1个答案

卫俊力
2023-03-14

最简单的解决方案是添加JobExecutionListener以便在FirstJob完成后进行回调。并且在afterjob回调中启动第二个作业。由于获得了第一个作业的executionContext,因此可以基于作业应用作业运行策略。

public class KpJobListener implements JobExecutionListener {

    private final static Logger LOG = LoggerFactory.getLogger(KpJobListener.class);

    private Job job;
    private JobLauncher jobLauncher;

    public KpJobListener(final Job job, final JobLauncher jobLauncher) {
        this.job = job;
        this.jobLauncher = jobLauncher;
    }

    @Override
    public void beforeJob(JobExecution jobExecution) {
        LOG.info("Starting job {}");
    }

    @Override
    public void afterJob(JobExecution jobExecution) {
        LOG.info("Job is completed job");
        CompletableFuture.runAsync(()->{
            try {
                jobLauncher.run(job, new JobParametersBuilder().toJobParameters());
            } catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
                    | JobParametersInvalidException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        });
    }

}

示例spring-batch.xml

<batch:job id="kpJob1" incrementer="jobIncrementer"
        restartable="true">
        <batch:listeners>
            <batch:listener>
                <bean class="com.kp.job.KpJobListener">
                    <constructor-arg name="job" ref="kpJob2" />
                    <constructor-arg name="jobLauncher" ref="jobLauncher" />
                </bean>
            </batch:listener>
        </batch:listeners>
        <batch:step id="kpJob1.step1" allow-start-if-complete="true">
            <batch:tasklet>
                <bean class="com.kp.job.step.task.KpTasklet" />
            </batch:tasklet>
        </batch:step>
    </batch:job>

您可以为消息传递服务增强这种方法,这可能是一个整洁的设计。

 类似资料:
  • 我已经在一个订单中链接了一组Spring批处理作业。 我怀疑任务执行者。在独立的情况下,我们不指定任何任务执行器(默认值为SyncTaskExecutor),作业流工作正常。但是在Jboss中部署时,我们使用SimpleAsyncTaskExecutor,因为在Jboss中使用SyncTaskExecutor甚至不会触发作业。 我在这里错过了什么,或者我在这里做错了什么。?请建议。

  • 我在BatchScheduler中有多个计划作业,它在特定时间运行。简单的内置JobLauncher,这是同步的。在自然界中最初使用。现在,我想并行运行这些作业,这样没有作业可以等待其他作业完成。 我在不同的作业上尝试过@Async注释,但都不起作用。 然后,我尝试设置joblauncher.settaskexecutor(新的SimpleAsyncTaskExecutor())。但这并不奏效。

  • 我当时正在开发一个Spring批处理应用程序,使用java配置执行两个批处理作业。最近,我添加了一个Spring调度程序来调度我编写的一个作业。侦听器在作业第一次完成时被调用,但在下一次执行后不会被调用。以下是我的作业配置代码: 下面是我的调度程序的代码: 我的听众如下: 以下是控制台输出: 请告诉我我做错了什么,为什么听者没有被执行后续尝试。

  • 大家好我有这样一个问题,我有2个异步功能。我只想在第一次完全结束后,运行第二次。这就是我试图做的: null null 但它并不总是起作用的,有时第二个函数的代码运行在第一个函数的代码之前,我不确定为什么,我用await强制第二个只在第一个结束之后。 我现在只想让第一个函数结束来激活第二个函数。

  • 我有点困惑,因为当通过HTTP请求启动Spring Batch作业的执行时,如果我在作业执行时收到另一个HTTP请求来启动相同的作业,但参数不同,则正在执行的作业停止未完成并开始处理新作业。 我开发了一个API REST来加载和处理Excel文件的内容。web服务公开了两个endpoint,一个用于加载、验证和存储数据库中Excel文件的内容,另一个用于开始处理存储在数据库中的记录。 > POST