using following JmsListener:
@JmsListener(destination = JMS_FOO_QUEUE, concurrency = "1", selector = JMS_BAR_SELECTOR)
public void receiveMessage(Message message) {
logger.debug("ENTER receiveMessage(), message= {}", message);
service.doStuff(message); //slow or long running task in spring Autowired Service bean
logger.debug("LEAVE receiveMessage()");
}
and Spring @Service Bean method:
@Override
public void doStuff(Message message) {
logger.debug("ENTER doStuff()");
... //slow or long running task depending on message
logger.debug("LEAVE doStuff()");
}
I got following concurrency problems:
2018-09-27 22:17:05,958 [DefaultMessageListenerContainer-XXX][DEBUG][MessageReceiver] - ENTER receiveMessage(), message= ActiveMQTextMessage {commandId = 813...
2018-09-27 22:17:05,990 [DefaultMessageListenerContainer-XXX][DEBUG][ServiceImpl] - ENTER doStuff(), longer execution path - commandId = 813
2018-09-27 22:17:05,991 [DefaultMessageListenerContainer-YYY][DEBUG][MessageReceiver] - ENTER receiveMessage(), message= ActiveMQTextMessage {commandId = 817...
2018-09-27 22:17:06,002 [DefaultMessageListenerContainer-YYY][DEBUG][ServiceImpl] - ENTER doStuff(), faster execution path - commandId = 817
2018-09-27 22:17:06,005 [DefaultMessageListenerContainer-YYY][INFO ][ServiceImpl] - updated data in database
2018-09-27 22:17:06,005 [DefaultMessageListenerContainer-YYY][DEBUG][ServiceImpl] - LEAVE doStuff() - commandId = 817
2018-09-27 22:17:06,054 [DefaultMessageListenerContainer-XXX][WARN ][MessageListenerContainer] - (Crash, org.hibernate.StaleStateException) - commandId = 813
doStuff() method updates some data in database based on business object in JMS Message, so it has to be done in order.
I trough that specifing concurrency=1 on JmsListener will limit execution to only one thread, in FIFO order. But as you can see in the logs, it's not happening - another consumer thread is working on next message even when first consumer thread not finished yet.
Why is this happening?
Spring - 4.2.7.RELEASE