0

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

MGorgon
  • 2,547
  • 23
  • 41

1 Answers1

0

I just tested it on Spring 4.3.19 without any problems - set a breakpoint in your listener and look down the stack for the DefaultMessageListenerContainer and check the concurrentConsumers field - it should be 1.

Gary Russell
  • 166,535
  • 14
  • 146
  • 179