【问题标题】:Run 2nd batch-job after execution of 1st job is complete Spring boot在第一个作业执行完成后运行第二个批处理作业 Spring boot
【发布时间】:2017-07-06 12:02:06
【问题描述】:

我想一个接一个地运行两个工作。是的,我确实在网上搜索过,但他们有解决方案,其中包括在第一步中添加第二份工作。但我有不同的要求。 第一个批处理作业执行完成后我会收到通知,第二个作业只有在收到此通知后才会运行。 甚至可以在 Spring Boot 中一个接一个地运行两个作业。 请帮忙!

【问题讨论】:

标签: spring-boot spring-batch


【解决方案1】:

可能是最简单的解决方案是在 FirstJob 完成后添加一个JobExecutionListener 用于回调。并在AfterJob 回调中启动第二个作业。由于您获得了 FirstJob 的 executionContext,您可以根据 Job 应用作业运行策略。

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>

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

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2015-11-04
    • 2015-08-24
    • 2022-10-17
    • 2021-01-15
    相关资源
    最近更新 更多