JMS在onMessage()中处理相同的消息

JMS在onMessage()中处理相同的消息,jms,spring-jms,jms2,Jms,Spring Jms,Jms2,我有一个JMS 2.0 MessageListener,它似乎偶尔重新处理消息,即使消息已成功处理(通过日志确认)。我怀疑需要执行session.commit(),但我不确定,因为在绝大多数情况下,不会重试消息。据我所知,AUTO_ACKNOWLEDGE是默认设置,但同样,我不太确定SessionWareMessageListener如何使用它 相关的spring.xml部分如下所示 <bean id="jmsContainer" class="org.spr

我有一个JMS 2.0 MessageListener,它似乎偶尔重新处理消息,即使消息已成功处理(通过日志确认)。我怀疑需要执行session.commit(),但我不确定,因为在绝大多数情况下,不会重试消息。据我所知,AUTO_ACKNOWLEDGE是默认设置,但同样,我不太确定SessionWareMessageListener如何使用它

相关的spring.xml部分如下所示

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        :
        :
        <property name="messageListener" ref="myMessageListener" />
        <property name="maxConcurrentConsumers" value="1" />
        <property name="receiveTimeout" value="5000" />
        <property name="sessionTransacted" value="true" />
    </bean>
所以,我现在看到的几乎所有消息都在日志中有这样的内容

:
JMSMessage Id : 1234, Entering onMessage()
JMSMessage Id : 1234, Retry count : 1
:
JmsMessage Id : 1234, Completed successfully!
JmsMessage Id : 3344, Entering onMessage() // New message taken up for processing.
JMSMessage Id : 3344, Retry count : 1
:
JMSMessage Id : 5566, Entering onMessage()
JMSMessage Id : 5566, Retry count : 1
:
JmsMessage Id : 5566, Completed successfully!
JMSMessage Id : 5566, Entering onMessage() // WHY IS JMS PROCESSING THE SAME MESSAGE (MESSAGEID : 5566) AGAIN ?
JMSMessage Id : 5566, Retry count : 2 
:
:
问题是,偶尔(在数千条消息之后),我会在日志中看到这一点

:
JMSMessage Id : 1234, Entering onMessage()
JMSMessage Id : 1234, Retry count : 1
:
JmsMessage Id : 1234, Completed successfully!
JmsMessage Id : 3344, Entering onMessage() // New message taken up for processing.
JMSMessage Id : 3344, Retry count : 1
:
JMSMessage Id : 5566, Entering onMessage()
JMSMessage Id : 5566, Retry count : 1
:
JmsMessage Id : 5566, Completed successfully!
JMSMessage Id : 5566, Entering onMessage() // WHY IS JMS PROCESSING THE SAME MESSAGE (MESSAGEID : 5566) AGAIN ?
JMSMessage Id : 5566, Retry count : 2 
:
:

当您将
sessionTransact
设置为true acknowledge mode(真实确认模式)时,甚至可以设置一个特殊值来表示未使用它,从其他示例中,我可以看到:

<property name="sessionAcknowledgeModeName" value="SESSION_TRANSACTED"/>


根据Gary Russell对stackoverflow问题的回答,如果使用DMLC将
SessionTransact
设置为true,则会话将在调用侦听器后由DMLC提交,如果侦听器抛出异常,事务将回滚。

我提供的答案是否有助于回答您的问题?如果没有,您是否找到了解决方案?