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