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