I am trying to configure JmsTemplate in transactional manner, so when error occures durring the processing or writing, i want the messages to be visible in the queue again. I have the below configurations which seems to works fine when error occures i.e. if error is thrown durring the writing or processing, the messages are "sent" back to the queue. But the problem is when everything is OK (i.e. no errors are thrown), then only one message is consumed, processed and dequeued. So if i have 10 messages in the queue, only one is dequeued and the job is marked as COMPLETED. If i configure JmsTemplate with
jmsTemplate.setSessionTransacted(false);
I have all messages consumed, processed and written, but of course I am loosing the transactional manner. The question is how to get all mesasges transactionaly consumed and processed and written?
I have the following JmsTemplate configuration
@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;
}
which is passed to my JmsItemReader
@Bean
public ItemReader<MyPojoClass> myJmsItemReader() throws Exception {
JmsItemReader<MyPojoClass> myJmsItemReader= new JmsItemReader<>();
myJmsItemReader.setItemType(MyPojoClass.class);
myJmsItemReader.setJmsTemplate(jmsTemplate);
myJmsItemReader.afterPropertiesSet();
return myJmsItemReader;
}
and below is my tasklet configuration
@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();
}