Передача сообщения в MQ при использовании @JmsListener - PullRequest
0 голосов
/ 29 января 2019

Я использую аннотации @EnableJms и @JmsListener для регистрации прослушивателя очереди в моем приложении, основываясь на этом учебном пособии.Я подключаюсь к IBM MQ, получаю фабрику соединений с помощью jndi.Я читал о режимах подтверждения и т. Д., Но все же это для меня новость.И моя проблема в том, что сообщение не возвращается в очередь (слушатель больше никогда не вызывается).

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory 
      = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());
    factory.setSessionTransacted(true);
    factory.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); //I have tried also CLIENT_ACKNOWLEDGE
    return factory;
}


@JmsListener(containerFactory = "jmsListenerContainerFactory", destination = "myQueue")
@SendTo("secondQueue")
public String testListener(String message){
 if(true) throw new NullPointerException();
 else return message;
}

Любая помощь будет высоко ценится.У меня был бы также второй вопрос.Из того, что я понимаю, если бы я хотел реализовать какую-либо операцию с базой данных, единственный способ откатить коммит (если после этого что-то пошло не так) - это создать менеджер транзакций?Если нет, мне нужно будет обнаружить дублирующееся сообщение.

Ответы [ 2 ]

0 голосов
/ 29 июля 2019

Сначала установите режим подтверждения на Session.CLIENT_ACKNOWLEDGE, и при получении сообщений, если они обрабатываются правильно, просто вызовите метод message.acknowledge(), иначе не вызывайте.

Он автоматически останется в очереди, и вам не нужно его повторно отправлять.

Вам необходимо использовать

import javax.jms.Message
0 голосов
/ 29 января 2019

Я создал простое приложение Spring Boot и контейнер Docker IBM MQ для проверки вашего случая.Я нашел хорошие инструкции в этом уроке: https://developer.ibm.com/tutorials/mq-jms-application-development-with-spring-boot/

И в вашем случае эта среда ведет себя как ожидалось: бесконечный цикл получения сообщения -> NullPointerException -> ответное сообщение -> ...

Когда я обнаружил функцию IBM MQ под названием «Очереди и пороги возврата», вы найдете объяснение в этом сообщении в блоге: https://community.ibm.com/community/user/imwuc/browse/blogs/blogviewer?BlogKey=28814801-083d-4c80-be5f-90aaaf81cdfb

Вкратце, можно ограничить количество раз, когда сообщение возвращалось в очередь послеисключение, и после этого лимита отправьте сообщение в другую очередь.

Может быть, в вашем случае эта функция используется в очереди назначения.

...