Java 将JobLaunchingGateway与spring批处理和spring集成一起使用引发DestinationResolutionException
我想定期扫描目录以查找与特定模式匹配的文件,并为找到的文件启动作业Java 将JobLaunchingGateway与spring批处理和spring集成一起使用引发DestinationResolutionException,java,spring,spring-integration,spring-batch,Java,Spring,Spring Integration,Spring Batch,我想定期扫描目录以查找与特定模式匹配的文件,并为找到的文件启动作业 @Configuration @EnableBatchProcessing public class BatchConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Autowired public Batc
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Autowired
public BatchConfiguration(final JobBuilderFactory jobBuilderFactory, final StepBuilderFactory stepBuilderFactory) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
@Bean
public FileMessageToJobRequest fileMessageToJobRequestTransformer(final Job myJob) {
return new FileMessageToJobRequest(myJob, "input.file.name");
}
@Bean
public MessageSource<File> fileMessageSource() {
final FileReadingMessageSource fileReadingMessageSource = new FileReadingMessageSource();
fileReadingMessageSource.setDirectory(directory));
fileReadingMessageSource.setFilter(new CompositeFileListFilter<>(Arrays.asList(
new AcceptOnceFileListFilter<>(),
new SimplePatternFileListFilter(pattern)
)));
return fileReadingMessageSource;
}
@Bean
public IntegrationFlow pollingFlow(final FileMessageToJobRequest fileMessageToJobRequest, final JobLaunchingGateway jobLaunchingGateway) {
return IntegrationFlows.from(fileMessageSource(),
c -> c.poller(Pollers.fixedDelay(10, TimeUnit.SECONDS)))
.transform(fileMessageToJobRequest)
.handle(jobLaunchingGateway)
.get();
}
@Bean
public JobLaunchingGateway jobLaunchingGateway(final JobLauncher jobLauncher) {
return new JobLaunchingGateway(jobLauncher);
}
// Step definition omitted for readability
@Bean(name = "myJob")
public Job myJob(final JobCompletionNotificationListener listener, final @Qualifier("step1") Step step) {
return jobBuilderFactory.get("myJob")
.preventRestart()
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(myStep)
.end()
.build();
}
}
执行作业后,如何停止将
JobLaunchingGateway
消息发布到输出通道?这是因为JobLaunchingGateway
是Request/reply组件,它需要outputChannel
或replyChannel
头。同时,您的配置中只有以下内容:
.handle(jobLaunchingGateway)
.get();
如果您对那里的回复不感兴趣,您可以在最后添加以下内容:
.handle(jobLaunchingGateway)
.channel("nullChannel")
.get();
伟大的我已经用ServiceActivator试过了,不知道也可以从流中完成。谢谢。如果您不想等待作业结果,还可以使用
JobLaunchingMessageHandler
。因此JobLaunchingGateway
是一个合适的MessageHandler
,它在返回JobExecution
之前简单地委托给JobLaunchingMessageHandler
?直接调用处理程序似乎是一个更好的主意,谢谢你的提示。JobLaunchingMessageHandler
只是一个POJO,从消息传递中释放出来,但它仍然是Request/reply,你会得到相同的无输出通道或replyChannel
错误:
.handle(jobLaunchingGateway)
.channel("nullChannel")
.get();