【问题标题】:Spring JMS - Exponential message re-delivery policy is ignoredSpring JMS - 忽略指数消息重新传递策略
【发布时间】:2014-06-28 22:15:06
【问题描述】:

我们正在尝试使用 spring jms 为 ActiveMQ 设置重新交付策略。我们为重新传递设置了指数回退,但它似乎被忽略了 - 消息重新传递之间的间隔是固定的,而不是指数增长。

有谁知道可能是什么问题?这是我们的 spring-jms 配置:

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"
    p:brokerURL="${activemq_url}">
    <property name="redeliveryPolicy" ref="redeliveryPolicy" />
</bean>

<bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
    <property name="queue" value="*" />
    <property name="initialRedeliveryDelay" value="10000" />
    <property name="redeliveryDelay" value="10000" />
    <property name="maximumRedeliveries" value="-1" />
    <property name="useExponentialBackOff" value="true" />
    <property name="backOffMultiplier" value="5" />
</bean>

<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory" 
    p:targetConnectionFactory-ref="connectionFactory" p:sessionCacheSize="10" 
    />

<!-- A JmsTemplate instance that uses the cached connection and destination -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="cachingConnectionFactory" />
    <property name="messageConverter" ref="messageConverter" />
    <property name="sessionTransacted" value="true" />
</bean>

<!-- The Spring message listener container configuration -->
<jms:listener-container container-type="default"
    destination-type="queue" connection-factory="connectionFactory"
    acknowledge="transacted" concurrency="1" cache="consumer">
    <jms:listener destination="testQueue" ref="testService"
        method="onMessage" />
</jms:listener-container>

谢谢!

编辑:这是一个日志示例,每 5 秒重新发送一次:

11 May 2014 18:52:00  WARN DefaultMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
javax.jms.JMSException: Sun May 11 18:52:00 IDT 2014
at ...
11 May 2014 18:52:05  WARN DefaultMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
javax.jms.JMSException: Sun May 11 18:52:05 IDT 2014
at ...
11 May 2014 18:52:10  WARN DefaultMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
javax.jms.JMSException: Sun May 11 18:52:10 IDT 2014
at ...
11 May 2014 18:52:15  WARN DefaultMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
javax.jms.JMSException: Sun May 11 18:52:15 IDT 2014
at ...
11 May 2014 18:52:20  WARN DefaultMessageListenerContainer - Execution of JMS message listener failed, and no ErrorHandler has been set.
javax.jms.JMSException: Sun May 11 18:52:20 IDT 2014
at ...

【问题讨论】:

  • 您说在固定间隔后重新发送相同消息的依据是什么。可以显示日志吗?
  • 查看我的编辑 - 如您所知,重新交付之间有固定的 5 秒间隔。
  • Ans 是同一条消息吗?
  • 是的,正如我已经说过的,这些都是相同消息的重新传递。
  • 尝试在侦听器容器中使用不同的消费者缓存设置

标签: java spring jms activemq spring-jms


【解决方案1】:

所以,我想我发现了问题: 之前在测试策略时,我抛出了 JMSException 来让消息重新传递。

我将抛​​出的异常更改为 Exception/RuntimeException,指数回退起作用了。

我不确定为什么 JMSException 会导致指数回退策略被忽略...有人有什么想法吗?

【讨论】:

  • 我相信 JMS 异常被假定与 JMS 连接有关,而不是您手头的业务案例。因此,对于 JMS 异常,它应该无限期地重试,而如果有另一种类型的异常,它应该按照 RedeliveryPolicy 停止。
猜你喜欢
  • 2021-07-22
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2023-03-19
  • 2018-08-25
相关资源
最近更新 更多