使用SESSION_TRANSACTED配置JmsTemplate时,只有一条消息出队

时间:2018-08-29 12:51:19

标签: spring-boot spring-batch activemq spring-transactions jmstemplate

我试图以事务方式配置JmsTemplate,所以当在处理或写入过程中发生错误时,我希望消息再次在队列中可见。我具有以下配置,当发生错误时,即当在写入或处理过程中抛出错误时,消息似乎被“发送”回队列。 但是问题是当一切正常时(即未引发任何错误),则仅消耗,处理和出队一条消息。 因此,如果我在队列中有10条消息,则仅将其中1条消息出队,并将该作业标记为COMPLETED。 如果我将JmsTemplate配置为

jmsTemplate.setSessionTransacted(false);

我已经消耗,处理和编写了所有消息,但是我当然失去了事务处理方式。 问题是如何使事务处理的所有消息消耗,处理和写入?

我具有以下JmsTemplate配置

@Bean
public JmsTemplate jmsTemplate() {
    JmsTemplate jmsTemplate = new JmsTemplate(activeMQConnectionFactory());
    jmsTemplate.setDefaultDestinationName(applicationProperties.getQueue());
    jmsTemplate.setDefaultDestination(queue());
    jmsTemplate.setReceiveTimeout(applicationProperties.getReceiveTimeout());
    jmsTemplate.setSessionTransacted(true);
    jmsTemplate.setSessionAcknowledgeMode(Session.SESSION_TRANSACTED);
    return jmsTemplate;
}

传递给我的JmsItemReader

@Bean
public ItemReader<MyPojoClass> myJmsItemReader() throws Exception {

    JmsItemReader<MyPojoClass> myJmsItemReader= new JmsItemReader<>();
    myJmsItemReader.setItemType(MyPojoClass.class);
    myJmsItemReader.setJmsTemplate(jmsTemplate);
    myJmsItemReader.afterPropertiesSet();
    return myJmsItemReader;

}

以下是我的tasklet配置

@Bean(name = "receiveProcessAndWrite")
public TaskletStep receiveProcessAndWrite() throws Exception {

    return this.stepBuilderFactory.get("receiveProcessAndWrite")
            .transactionManager(transactionManager)
            .<MyPojoClass, MyPojoClass>chunk(1000)
            .readerIsTransactionalQueue()
            .reader(myJmsItemReader())
            .processor(myprocessor())
            .writer(updateStatusInDBandWrite())
            .listener(new ChunkCountListener())
            .build();

}

0 个答案:

没有答案