3

我正在使用如下定义的 spring jms 侦听器。它通常工作正常但是我看到它根据recieveTimeout设置不断断开和重新连接。

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <!-- mrgm connection to the jca adapter -->
    <property name="connectionFactory" ref="mrgmConnectionFactory" />
    <!-- name of the topic -->
    <property name="destinationName" value="test.destinationname" />
    <!-- class which will listen for messages (must implement javax.jms.MessageListener -->
    <property name="messageListener" ref="TestListener" />
    <property name="sessionTransacted" value="true" />
    <property name="receiveTimeout" value="1000" />
            <!--turning this on drops all messages -->
            <!--        <property name="pubSubDomain" value="true" /> -->

</bean>

我已经做了一些测试,当有很多消息发布到该主题时,它会丢弃一些,因为如果消息是在断开连接和重新连接之间的一小段时间内出现的,那么听众显然会错过它。

如果我将recieveTimeout 设置为0,这个问题就会消失。收听某个主题时,我应该始终将 recieveTimeout 设置为 0 吗?还是我以错误的方式处理整个过程。

4

1 回答 1

0

断开连接和重新连接时,如果您的订阅者不是持久的,您可能会丢失消息。然而,弹簧 DMLC 不应重新连接。你能再解决一下吗?它本质上应该订阅一个主题session.createConsumer(..),然后循环consumer.receive()consumer.receive(timeout). 不确定为什么在将超时设置得更高时您的 DMLC 会重新连接。

不过,您应该没有超时就可以了,但是您可能希望通过调试日志记录等来跟踪重新连接的原因。

于 2012-08-25T10:46:04.173 回答