我正在使用 Spring JMS 和 MQ 来发送和接收消息。在读取消息时,我想确保在发生任何错误时,消息将被重新传递至少 3 次,然后将它们发送到 Backout Queue。主队列的回退阈值为 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);
}
}
最佳答案
“不工作”的信息永远不够。
这就是说
}catch(Exception E){
logger.erro(e);
}
你正在捕捉并吃掉异常;监听器需要抛出异常才能重新排队消息。
关于java - Spring JMS 消息不会重试或在错误时进入回退队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56192807/