04_ActiveMQ事務與三種簽收方式


【ActiveMQ添加事務】

添加事務主要注意兩點:

1.修改Session配置,啟用事務

/**
 * 3.通過Connection對象創建Session會話(上下文環境對象),用於接收消息。
 *   參數1:是否啟用事務 
 *   參數2:簽收模式,一般設置為自動簽收
 */
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);

2.代碼最后提交事務(必須要提交事務,不然在MQ上無法得到發送的消息)

//提交事務
session.commit();

[ session設置啟用事務,但不加session.commit(),執行代碼之后,這里不會改變 ]

[ 加了session.commit(),執行代碼之后,MQ上就會有對應的消息 ]

 

【三種簽收方式】

[ Session.AUTO_ACKNOWLEDGE ]

當客戶端從receiver或onMessage成功返回時,Session自動簽收客戶端的這條消息的收條。

 

[ Session.CLIENT_ACKNOWLEDGE ]

客戶端通過調用消息(Message)的acknowledge方法簽收消息。在這種情況下,簽收發生在Session層面:簽收一個已經消費的消息會自動地簽收這個Session所有已消費的收條。

 

[ Session.DUPS_OK_ACKNOWLEDGE ]

Session不必確保對傳送消息的簽收,這個模式可能會引起消息的重復,但是降低了Session的開銷,所以只有客戶端能容忍重復的消息,才可使用。

 

【  Session.CLIENT_ACKNOWLEDGE 簽收方式

[ 修改Send.java ]

/**
 * 3.通過Connection對象創建Session會話(上下文環境對象),用於接收消息。
 *   參數1:是否啟用事務 啟用事務
 *   參數2:簽收模式,修改為 客戶端確認簽收 */
Session session = connection.createSession(Boolean.TRUE, Session.CLIENT_ACKNOWLEDGE);

[ 修改 Receiver.java ]

消費者的session與生產者的session簽收模式保持一致,注意,生產者啟用事務了,但是消費者這里事務不要啟用,不然會一直消費

/**
 * 3.通過Connection對象創建Session會話(上下文環境對象),用於接收消息。
 *   參數1:是否啟用事務 消費者不啟用事務
 *   參數2:簽收模式,修改為 客戶端確認簽收 */
Session session = connection.createSession(Boolean.FALSE, Session.CLIENT_ACKNOWLEDGE);
消費者獲取消息時添加一行:msg.acknowledge();
/**
 * 7.最后,使用JMS規范的TextMessage形式創建數據(通過Session對象),
 *   發送端使用MessageProducer的Send方法發送數據。
 *   接受端使用receive方法接收數據。
 */
while(true){
    TextMessage msg = (TextMessage)messageConsumer.receive();
    //消費者手工去簽收消息,另起一個線程(TCP)去通知MQ服務確認消息簽收
 msg.acknowledge(); if(msg==null) 
        break;
    System.out.println("【消費者接收】"+msg.getText());
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM