我试图以事务方式配置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();
}