Слушатель сообщения Spring / РУЧНОЕ подтверждение
Я знаю, что это звучит так, как слышали 1000 раз, но я так не думаю, и я не мог найти решение:
С обычным ejb я могу использовать режим подтверждения для подтверждения сообщения () вручную. Если я не сделаю, это будет доставлено. Я делал это в прошлом, и это работало хорошо.
При использовании Spring JMS у меня проблема в том, что мне кажется, что я могу настроить повторную доставку только в том случае, если выдается исключение, или нет вообще.
Как это реализовать как с ejb?
Моя проблема: если сообщение подтверждено, я НЕ хочу, чтобы оно вообще доставлялось, даже если возникает исключение.
3 ответа
Спасибо за ответ. Но я сделал это точно так, за исключением того, что я использую Spring 3 и конфигурацию аннотаций. Проблема не в получении, а в подтверждении. Если я использую транзакцию или нет, кажется, что сообщение автоматически подтверждается при получении.
Я попробовал это, расширив MessageListener напрямую и следуя пути... отмечая, работает.
public class JMSListener implements SessionAwareMessageListener<TextMessage> {
...
@Override
public void onMessage(TextMessage message, Session session) {
...
}
}
Таким образом, я могу видеть настройки сеанса. Например, session.getAcknowledgeMode() доставляет подтверждение клиента, а session.getTransacted() возвращает истину или ложь в зависимости от того, что я установил. Но, похоже, никакого эффекта нет. Похоже, сообщение все равно подтверждается.
Существует также разница в документе Java для CLIENT_ACKNOWLEDGE весны и Джи. На весну написано:
"CLIENT_ACKNOWLEDGE": автоматическое подтверждение сообщения после успешного выполнения слушателя; Нет возврата в случае исключения.
Для джипа написано:
CLIENT_ACKNOWLEDGE В этом режиме подтверждения клиент подтверждает полученное сообщение, вызывая метод подтверждения сообщения.
Для меня это может быть причиной? Но если это действительно так (а я не могу в это поверить), это сделает весну непригодной для обработки сообщений?
Мы можем использовать SpringMessageLessererContainer для ваших требований.
Пожалуйста, найдите ниже документацию от Spring:
Аналогично компоненту, управляемому сообщениями (MDB) в мире EJB, управляемый сообщениями POJO (MDP) действует как приемник для сообщений JMS. Единственное ограничение (но см. Также ниже для обсуждения класса MessageListenerAdapter) для MDP заключается в том, что он должен реализовывать интерфейс javax.jms.MessageListener. Также имейте в виду, что в случае, когда ваш POJO будет получать сообщения в нескольких потоках, важно убедиться, что ваша реализация является поточно-ориентированной.
http://docs.spring.io/spring/docs/2.5.x/reference/jms.html
Ниже приведен фрагмент кода, в котором я добавил метод метод mark ().
Класс слушателя JMS:
public class MyProjectJMSListener implements MessageListener {
public void onMessage(Message message) {
try {
message.acknowledge();
//Business logic to be added
}
catch (JMSException ex) {
throw new RuntimeException(ex);
}
}
}
весна-JMS-config.xml
<bean id="messageListener" class="com.myproj.MyProjectJMSListener" />
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/> <!-- connectionFactory bean class to be added -->
<property name="destination" ref="my.jms.destination"/>
<property name="messageListener" ref="messageListener" />
</bean>
Для «sessionAcknowledgeMode» установлено значение «AUTO_ACKNOWLEDGE» (по умолчанию): этот режим зависит от контейнера: для DefaultMessageListenerContainer это означает автоматическое подтверждение сообщения перед выполнением прослушивателя, без повторной доставки в случае исключения и без повторной доставки в случае прерывания выполнения других прослушивателей. . Для SimpleMessageListenerContainer это означает автоматическое подтверждение сообщения после выполнения прослушивателя, без повторной доставки в случае пользовательского исключения, но с потенциальной повторной доставкой в случае отказа JVM во время выполнения прослушивателя. Чтобы последовательно организовать повторную доставку с любым вариантом контейнера, рассмотрите режим «CLIENT_ACKNOWLEDGE» или, что предпочтительнее, вместо этого установите для «sessionTransacted» значение «true». «sessionAcknowledgeMode» установлен в «DUPS_OK_ACKNOWLEDGE»: Ленивое подтверждение сообщения во время (DefaultMessageListenerContainer) или вскоре после (SimpleMessageListenerContainer) выполнения слушателя; нет повторной доставки в случае пользовательского исключения, но потенциальной повторной доставки в случае смерти JVM во время выполнения прослушивателя. Чтобы последовательно организовать повторную доставку с любым вариантом контейнера, рассмотрите режим «CLIENT_ACKNOWLEDGE» или, что предпочтительнее, вместо этого установите для «sessionTransacted» значение «true». «sessionAcknowledgeMode» установлен в «CLIENT_ACKNOWLEDGE»: автоматическое подтверждение сообщения после успешного выполнения слушателя; повторная доставка с наилучшими усилиями в случае возникновения пользовательского исключения, а также в случае прерывания выполнения других слушателей (например, отключение JVM). «sessionTransacted» установлено в «true»: Подтверждение транзакции после успешного выполнения слушателя; гарантированная повторная доставка в случае возникновения пользовательского исключения, а также в случае других прерываний выполнения слушателя (например, смерти JVM).
Платформа Spring JMS предоставляет верхний уровень абстракции для подтверждения сообщений. Пользователям нужно только учитывать сценарий повторной доставки сообщения в случае возникновения пользовательского исключения.
Таким образом, следует позаботиться о bean-компоненте фабрики контейнеров прослушивателя сообщений и соответствующим образом настроить параметр jms.