我有一个spring boot / integration / batch,它将在SFTP上运行和轮询文件。
我希望能够最终使用{{1重新启动作业(可能因为应用程序已重新启动或因为某些原因我们再次收到相同的文件)使用相同的参数(基本上是相同的文件)在Job&#39的配置中定义。
不幸的是,run.id = 1没有增加,我得到RunIdIncrementer
JOB配置
JobInstanceAlreadyCompleteException
集成
@Autowired
private JobBuilderFactory jobBuilders;
@Bean
public Job importOffersJob() {
Job job = jobBuilders.get("importOffersJob")
.start(importOffersStep)
.listener(traceJobExecutionListener())
.incrementer(new RunIdIncrementer())
.build();
return job;
}
@Bean
public IntegrationFlow ftpInboundFlow() {
return IntegrationFlows
.from(Sftp.inboundAdapter(SftpSessionFactory())
.regexFilter(".*\\.xml.mini$")
.deleteRemoteFiles(intCfg.getSftpDeleteRemoteFiles())
.preserveTimestamp(Boolean.TRUE)
.autoCreateLocalDirectory(Boolean.TRUE)
.remoteDirectory(intCfg.getSftpRemoteDirectory())
.localDirectory(new File(intCfg.getSftpLocalDirectory())
),
e -> e.id("sftpInboundAdapter")
.poller(Pollers.fixedRate(intCfg.getSftpPollerInMinutes(), TimeUnit.MINUTES).maxMessagesPerPoll(1)))
.transform(fileToJobLaunchRequestTransformer())
.handle(jobLaunchingGw())
.handle(logger())
.get();
}
如果我取消注释public class FileToJobLaunchRequestTransformer implements GenericTransformer<Message<File>, JobLaunchRequest> {
private final static Logger log = LoggerFactory.getLogger(FileToJobLaunchRequestTransformer.class);
@Autowired
@Qualifier("importOffersJob")
private Job job;
@Override
public JobLaunchRequest transform(Message<File> source) {
log.info("FileToJobLaunchRequestTransformer, source.getPayload().getAbsolutePath(): {}", source.getPayload()
.getAbsolutePath());
JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
jobParametersBuilder.addString("pathToFile", "file:" + source.getPayload().getAbsolutePath());
//jobParametersBuilder.addString("UUID", UUID.randomUUID().toString());
JobParameters jobParams = job.getJobParametersIncrementer().getNext(jobParametersBuilder.toJobParameters());
return new JobLaunchRequest(job, jobParams);
}
}
它正在运行,但我认为关键是能够重复使用我的工作配置中定义的增量器吗?
(当我在没有集成的情况下运行与简单弹簧引导相同的批次时,增量器正在工作)
非常感谢答案 0 :(得分:2)
RunIdIncrementer.getNext()
:
public JobParameters getNext(JobParameters parameters) {
JobParameters params = (parameters == null) ? new JobParameters() : parameters;
long id = params.getLong(key, 0L) + 1;
return new JobParametersBuilder(params).addLong(key, id).toJobParameters();
}
您每次都在创建一个新的作业参数,因此它总是返回1,因为run.id
不存在。
如果您将jobParametersBuilder
移动到转换器中的字段以及job
旁边,它将起作用,但仅适用于您的应用的此实例化。它会在您下次启动应用时再次从1开始。
要重新启动,您需要在某处保存run.id
值,或者需要从存储库中获取最后一个作业参数。