1. 程式人生 > >04_ActiveMQ事務與三種簽收方式

04_ActiveMQ事務與三種簽收方式

ole com 發送數據 ive message ack tex get color

【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());
}

04_ActiveMQ事務與三種簽收方式