Spring batch Spring与JMS的批处理集成
目前正在进行一个spring批处理项目,我们将在应用程序启动时启动作业。我的spring批处理作业(多线程步骤)包括:Spring batch Spring与JMS的批处理集成,spring-batch,spring-integration,spring-jms,Spring Batch,Spring Integration,Spring Jms,目前正在进行一个spring批处理项目,我们将在应用程序启动时启动作业。我的spring批处理作业(多线程步骤)包括: 使用JmsItemReader读取jms消息 处理消息时,将其转换为模型对象 在提交到数据库之前,在编写器中调用某些rest服务 然而,我们现在希望在消息添加到队列时启动作业,经过研究,我认为最好的解决方案是使用SpringIntegrationServiceActivator启动作业。我面临的问题是,一旦启动作业并执行Jms项读取器,消息就不再在队列中,因为它们已被Cha
- 使用JmsItemReader读取jms消息
- 处理消息时,将其转换为模型对象
- 在提交到数据库之前,在编写器中调用某些rest服务
@Bean
public JmsItemReader<Message> reader() {
JmsItemReader<Message> itemReader = new JmsItemReader<>();
itemReader.setItemType(Message.class);
itemReader.setJmsTemplate(jmsTemplate());
return itemReader;
}
// Jobs et Steps
@Bean
Step stepDetectionIncoherencesLiq(@Autowired StepBuilderFactory steps) {
int threadSize = Integer.parseInt(env.getProperty(PropertyConstant.THREAD_POOL_SIZE));
return steps.get("stepDetectionIncoherencesLiq").<Message, DetectionIncoherenceLiqJmsOut>chunk(1)
.reader(reader())
.processor(processor())
.writer(writer()).readerIsTransactionalQueue().faultTolerant()
.taskExecutor(taskExecutor()).throttleLimit(threadSize)
.listener(stepListener()).build();
}
@Bean
// @DependsOn({"getJobRepository"})
Job job(@Autowired JobBuilderFactory jobs,
@Qualifier("stepDetectionIncoherencesLiq") Step stepDetectionIncoherencesLiq) {
LOGGER.error("Creation bean job ");
return jobs.get("job")
.incrementer(new RunIdIncrementer())
.start(stepDetectionIncoherencesLiq).build();
}
和服务激活器:
@ServiceActivator(inputChannel = "inputChannel", outputChannel = "outputChannel")
public JobLaunchRequest process(DetectionIncoherenceLiqJmsOut jmsOut) {
log.info("Starting Job");
JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
return new JobLaunchRequest(job, jobParametersBuilder.toJobParameters());
}
我刚接触spring集成,我发现这很难,我有以下问题:
- 如何在不使用消息的情况下触发作业
- 任何人都可以提供通道项读取器或tasklet的代码吗?我可以从频道而不是队列中读取消息吗
- 将jms消息转换为模型对象并将其传递到作业参数中好吗? 谢谢你的帮助
@ServiceActivator(inputChannel = "inputChannel", outputChannel = "outputChannel")
public JobLaunchRequest process(DetectionIncoherenceLiqJmsOut jmsOut) {
log.info("Starting Job");
JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
return new JobLaunchRequest(job, jobParametersBuilder.toJobParameters());
}