1

我使用 apacheMQ 作为队列管理器。我正在使用 Spring 的 DefaultMessageListenerContainer 来使用消息。我已经配置它,所以它有一个事务:

<bean id="jmsContainerXXX" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="myConnectionFactory"/>
    <property name="destination" ref="myDestination"/>
    <property name="messageListener" ref="myMessageListener" />
    <property name="concurrentConsumers" value="5"/>
    <property name="sessionTransacted" value="true" />
</bean>

我已将 ApacheMQ 配置为具有特定的重新传递策略,因此如果消息未成功处理,则会在 1 分钟、5 分钟、25 分钟等后重新传递:

<redeliveryPlugin fallbackToDeadLetter="true" sendToDlqIfMaxRetriesExceeded="true">
    <redeliveryPolicyMap>
        <redeliveryPolicyMap>
            <!-- the fallback policy for all destinations -->
            <defaultEntry>
                <redeliveryPolicy maximumRedeliveries="10" 
                                  maximumRedeliveryDelay="14400000"
                                  redeliveryDelay="60000"
                                  initialRedeliveryDelay="60000" 
                                  useExponentialBackOff="true"
                                  backOffMultiplier="5"/>
            </defaultEntry>
        </redeliveryPolicyMap>
    </redeliveryPolicyMap>
</redeliveryPlugin>

最后,在消息侦听器中,我放置了一个粗体'throw new RuntimeException("poum");' 以确保交付失败。

这就是我得到的结果: - 起初,ActiveMQ 将消息传递给我 6 次,然后等待。- 1 分钟后,ActiveMQ 再传递 6 次消息,然后等待。- 5 分钟后,ActiveMQ 再传递 6 次消息,然后等待。- ETC。

我的问题是:为什么 ActiveMQ 在重新调度之前传递消息 6 次?

4

1 回答 1

0

如果您无法交付,那是一回事,交付时是另一回事,但您会遇到异常。 http://activemq.apache.org/message-redelivery-and-dlq-handling.html

我认为默认毒丸值是6?不确定。

于 2013-11-13T09:51:35.683 回答