Spring batch Spring与JMS的批处理集成

Spring batch Spring与JMS的批处理集成,spring-batch,spring-integration,spring-jms,Spring Batch,Spring Integration,Spring Jms,目前正在进行一个spring批处理项目,我们将在应用程序启动时启动作业。我的spring批处理作业(多线程步骤)包括: 使用JmsItemReader读取jms消息 处理消息时,将其转换为模型对象 在提交到数据库之前,在编写器中调用某些rest服务 然而,我们现在希望在消息添加到队列时启动作业,经过研究,我认为最好的解决方案是使用SpringIntegrationServiceActivator启动作业。我面临的问题是,一旦启动作业并执行Jms项读取器,消息就不再在队列中,因为它们已被Cha

目前正在进行一个spring批处理项目,我们将在应用程序启动时启动作业。我的spring批处理作业(多线程步骤)包括:

  • 使用JmsItemReader读取jms消息
  • 处理消息时,将其转换为模型对象
  • 在提交到数据库之前,在编写器中调用某些rest服务
然而,我们现在希望在消息添加到队列时启动作业,经过研究,我认为最好的解决方案是使用SpringIntegrationServiceActivator启动作业。我面临的问题是,一旦启动作业并执行Jms项读取器,消息就不再在队列中,因为它们已被ChannelPublishingJmsMessageListener使用

我的代码:

 @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());
}