簡體   English   中英

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

[英]JMS processing same message in onMessage()

我有一個 JMS 2.0 MessageListener,即使消息已成功處理(通過日志確認),它似乎也會偶爾重新處理消息。 我懷疑需要完成 session.commit() 但我不確定,因為在絕大多數情況下,消息不會重試。 據我了解,AUTO_ACKNOWLEDGE 是默認設置,但我不太確定它對 SessionAwareMessageListener 是如何工作的。

相關的 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>

MessageListener 實現如下

public class MyMessageListener implements SessionAwareMessageListener {

   // All spring autowired objects
   :
   :
   @Override
   public void onMessage(Message message, Session session)
   {
     logger.debug("JMSMessage ID : " + message.JMSMessageId, "Entering onMessage() ...");
     logger.debug("JMSMessage ID : " + message.JMSMessageId, "Retry Count : " + message.getIntProperty("JMSXDeliveryCount"));
     try
     {
     
     }
     catch(JMSException e)
     {
        // Log something 
        throw new RuntimeException(e);
     }
     catch(Exception ex)
     {
        if(certain types of exceptions)
        {
          session.rollback();
          System.Exit(1);
        }
        
        throw new RuntimeException(ex);

     }
     // THE FOLLOWING IS THE LAST LINE IN onMessage()
     logger.debug("JMSMessage ID : " + message.JMSMessageId,"Completed successfully !");

   }


}

所以,我現在看到的幾乎所有消息都在日志中

:
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 
:
:

當您將sessionTransacted設置為 true 確認模式被忽略時,甚至可以設置一個特殊值來表示它沒有被使用,從其他示例中我看到了這一點:

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

According to Gary Russell's answer to the stackoverflow question Spring DMLC message consumption: auto_ack vs Transacted Session , if you have sessionTransacted set to true with a DMLC, the session is committed by the DMLC after the listener is called, if the listener throws an exception the事務被回滾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM