我已经成功地实现了Spring批处理,但有一点我被卡住了。我需要在我的批处理作业完成后执行一个操作。
我不能在一个步骤中执行操作,因为一旦工作完全完成,只有我才能做到这一点。
我会讲述这个场景,步骤1:从读取器中提取数据,在处理器中转换数据并写入数据库。
步骤2:从数据库中读取数据,应用逻辑并在处理器中转换,然后将其写入数据库。
以上内容已完成,运行良好。一旦完成了上述步骤,我必须将从api接收的数据与数据库中的数据进行比较,然后我必须从数据库中删除不属于api数据的记录。我不能把这作为一个步骤来做,因为来自api的数据顺序并不总是相同的。
我是Spring批的新手,试图找到一种方法,但未能得出结论。提前谢谢。
正如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" />
// 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 ;
}