簡體   English   中英

Spring JMS消息不會重試或在出錯時轉到Backout Queue

[英]Spring JMS Message doesn't retry or goes to Backout Queue on Error

我正在使用Spring JMS和MQ來發送和接收消息。 在閱讀消息時,我想確保在任何錯誤上,消息將至少重新傳送3次,然后再將其發送到退出隊列。 主隊列的退出閾值為3。

我使用Transacted設置為True,sessionAcknowledgeMode使用CLIENT_ACKNOWLEDGE(值為2)。 在Message Listener中,我也在做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);
    }
}

“不工作”是永遠不夠的信息。

那就是說

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

你正在捕捉並吃掉這個例外; 監聽器需要拋出異常來重新排列消息。

我能夠使用以下方法解決問題。 我希望它會幫助別人。


組態

<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");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM