Сообщение Spring JMS не повторяется или переходит в очередь возврата при ошибке - PullRequest
0 голосов
/ 17 мая 2019

Я использую Spring JMS и MQ для отправки и получения сообщений.При чтении сообщений я хочу убедиться, что в случае любой ошибки сообщения будут повторно доставлены не менее 3 раз, а затем отправлены в очередь возврата.Основная очередь имеет порог возврата 3.

Я использую для Transacted значение True, а для sessionAcknowledgeMode значение CLIENT_ACKNOWLEDGE (значение равно 2).И в Слушателе сообщений я также делаю message.acknowledge ();Тем не менее, это не работает.Я что-то упустил?

<jee:jndi-lookup id="QConnectionFactory" jndi-name="jndi/QCF"/>
<jee:jndi-lookup id="MainQ" jndi-name="jndi/MainQ"/>
<jee:jndi-lookup id="MainQBO" jndi-name="jndi/MainQBO"/>

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory">
        <ref local="QConnectionFactory"/>
    </property>
    <property name="sessionAcknowledgeMode" value="2" />
    <property name="sessionTransacted" value="true" />
</bean>

<bean id="msgHandler" class="myservice.MyMessageHandler">
    <property name="jmsTemplate" ref="jmsTemplate"/>
    <property name="MainQ" ref="MainQ"/>
    <property name="MainQBO" ref="MainQBO"/>
</bean>


<bean id="messageListener" class="myservice.MyMessageListener" />
<bean id="jmsContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="QConnectionFactory"/>
    <property name="destination" ref="MainQ"/>
    <property name="messageListener" ref="messageListener" />
    <property name="sessionTransacted" value="true"/>
    <property name="sessionAcknowledgeMode" value="2"/>
</bean>

Listener Class ...
public void onMessage(Message message) {
    try{
         ... some code ...
         message.acknowledge();
    }catch(Exception E){
        logger.erro(e);
    }
}

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Мне удалось решить проблему, используя следующий подход.Я надеюсь, что это поможет другим.


Конфигурация

<bean id="messageListener" class="messageListenerClass" />
<bean id="fixedBackOff" class="org.springframework.util.backoff.FixedBackOff">
    <constructor-arg index="0" value="30000" />
    <constructor-arg index="1" value="3" />
</bean>
<bean id="jmsContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory"  ref="connectionFactoryBean" />
    <property name="destination"        ref="destinationQueue" />
    <property name="messageListener"    ref="messageListener" />
    <property name="sessionTransacted"  value="true" />
    <property name="backOff"            ref="fixedBackOff" />
</bean>

Класс слушателя

@Override
public void onMessage(Message message) {
    if (message instanceof TextMessage) {
        try {
            String msg = ((TextMessage) message).getText();
            ........
            ........
        } catch (JMSException e) {
            logger.error("JMSException occured while reading the JMSMessage : {}", e);
            throw new RuntimeException();
        } catch (SomeException e) {
            logger.error("SomeException ... : {}", e);
            throw new RuntimeException();
        } catch (SomeException e) {
            logger.error("SomeException ... : {}", e);
            throw new RuntimeException();
        }
    } else {
        logger.error("Message must be of type TextMessage");
        throw new IllegalArgumentException("Message must be of type TextMessage");
    }
}
0 голосов
/ 17 мая 2019

«Не работает» никогда не бывает достаточно информации.

При этом

}catch(Exception E){
    logger.erro(e);
}

Вы ловите и едите исключение;слушатель должен выдать исключение для повторного запроса сообщения.

...