Spring JMS параллелизм = 1, но вызвано два метода receiveMessage - PullRequest
0 голосов
/ 27 сентября 2018

с использованием следующего 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()");
}

и метода Spring @Service Bean:

@Override
public void doStuff(Message message) {
    logger.debug("ENTER doStuff()");
    ... //slow or long running task depending on message
    logger.debug("LEAVE doStuff()");
}

У меня возникли следующие проблемы параллелизма:

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 ()Метод обновляет некоторые данные в базе данных на основе бизнес-объекта в сообщении JMS, поэтому это нужно сделать по порядку.

Я отмечаю, что указание параллелизма = 1 в JmsListener ограничит выполнение только одним потоком в порядке FIFO.Но, как видно из журналов, этого не происходит - другой потребительский поток работает над следующим сообщением, даже если первый потребительский поток еще не завершен.

Почему это происходит?

Spring - 4.2.7.RELEASE

1 Ответ

0 голосов
/ 01 октября 2018

Я только что проверил это на Spring 4.3.19 без проблем - установите точку останова в вашем слушателе и посмотрите вниз по стеку для DefaultMessageListenerContainer и проверьте поле concurrentConsumers - оно должно быть 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...