更新時間:2018年11月26日16時31分 來源:傳智播客 瀏覽次數(shù):
ActiveMQ 是支持事務(wù)的
/**
* 通過Connection對象創(chuàng)建Session會話,用于接收消息。
* 參數(shù)1:是否啟用事務(wù) * 參數(shù)2:簽收模式,默認(rèn)設(shè)置為自動簽收
*/
Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);是否添加事務(wù)的區(qū)別
MQ的簽收方式【三種簽收方式】
[ Session.AUTO_ACKNOWLEDGE ]
當(dāng)客戶端從receiver或onMessage成功返回時,Session自動簽收客戶端的這條消息的收條。
[ Session.CLIENT_ACKNOWLEDGE ]
客戶端通過調(diào)用消息(Message)的acknowledge方法簽收消息。
在這種情況下,簽收發(fā)生在Session層面:
簽收一個已經(jīng)消費的消息會自動地簽收這個Session所有已消費的收條。
[ Session.DUPS_OK_ACKNOWLEDGE ]
Session不必確保對傳送消息的簽收,這個模式可能會引起消息的重復(fù),但是降低了Session的開銷,所以只有客戶端能容忍重復(fù)的消息,才可使用。
[Session.CLIENT_ACKNOWLEDGE 簽收方式】
一般來說 要求消息能夠準(zhǔn)確送達(dá)的 都用第二種手動簽收方式對消息送達(dá)率要求不是十分精確的都用第一種默認(rèn)的自動簽收
***注意手動簽收需要調(diào)用 msg.acknowledge();方法
告訴mq的服務(wù)器 消息已經(jīng)簽收這個消息才會被消費掉
while(true){
TextMessage msg =(TextMessage)messageConsumer.receive();
//消費者手工去簽收消息,另起一個線程(TCP)去通知MQ服務(wù)確認(rèn)消息簽收
msg.acknowledge();
if(msg==null)
break;
System.out.println("【消費者接收】"+msg.getText());
}
***在手動簽收的情況下 如果生產(chǎn)者生產(chǎn)消息開啟了事務(wù)那個在消費者消費消息的時候就不用開啟事務(wù)
消費者的session與生產(chǎn)者的session簽收模式保持一致,
注意,生產(chǎn)者啟用事務(wù)了,但是消費者這里事務(wù)不要啟用,不然會一直消費例如:
//生產(chǎn)者session
//開啟事務(wù)
//手動簽收
Session session= connection.createSession(Boolean.TRUE,Session.CLIENT_ACKNOWLEDGE);
//消費者session
//關(guān)閉事務(wù)
//手動簽收Session session =connection.createSession(Boolean.FALSE, Session.CLIENT_ACKNOWLEDGE);
首發(fā):http://java.itcast.cn