批处理作业完成后必须执行操作

时间:2016-04-16 04:50:42

标签: spring-batch

我已经成功实施了Spring批处理,但我一度陷入困境。我的批处理作业完成后,我需要执行一个操作。

我无法在一个步骤中执行操作,因为一旦完成作业,我只能执行此操作。

我会告诉场景, 步骤1:从读取器中提取数据,转换处理器中的数据并写入数据库。

第2步:从数据库中读取数据,应用逻辑并在处理器中转换并将其写入数据库。

以上操作完成且工作正常。完成上述步骤后,我必须将从api接收的数据与db中的数据进行比较,然后我必须从我的数据库中删除不属于api数据的记录。我不能这样做,因为来自api的数据顺序始终不同。

我是Spring批次的新手,并试图找到一种方法,但无法得出结论。提前谢谢。

2 个答案:

答案 0 :(得分:0)

正如Martin Hauner所说,JobExecutionListener将提供一个名为afterJob()的钩子方法。

请注意,您应该在工作中注册听众。

<job id="exampleJob">
    <step id="step1" />
    <step id="step2" />
    <listeners>
        <listener ref="yourJobListener" />
    </listeners>
</job>

<bean id="yourJobListener" class="com.example.job.listener.YourJobListener" />

答案 1 :(得分:0)

 // used spring boot + spring batch 2.x

//your config class {

  @Bean
    public Job myjob() {
            return jobBuilderFactory.get("myjob")
             .incrementer(new RunIdIncrementer())
             .flow(readData())
             .end()
             .listener(myjoblistener()).build();
        }

    @Bean
        public JobExecutionListener myjoblistener() {

            JobExecutionListener listener = new JobExecutionListener() {

                @Override
                public void beforeJob(JobExecution jobExecution) {

                    // TODO Auto-generated method stub
                }

                @Override
                public void afterJob(JobExecution jobExecution) {

                    flatfiletoWrite = new HashSet<>();

                    try {
                        Files.write(Paths.get(""), Arrays.asList("foo"),
                                StandardOpenOption.APPEND);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    //sysout("Job has been completed");
                }
            };

            return listener ;
        }