Слушатель сообщения 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.

Другие вопросы по тегам