教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

AcitveMQ的事物以及簽收方式

更新時(shí)間:2018年11月26日16時(shí)31分 來(lái)源:傳智播客 瀏覽次數(shù):

  ActiveMQ 是支持事務(wù)的

  /**

  * 通過(guò)Connection對(duì)象創(chuàng)建Session會(huì)話(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)客戶(hù)端從receiver或onMessage成功返回時(shí),Session自動(dòng)簽收客戶(hù)端的這條消息的收條。

  [ Session.CLIENT_ACKNOWLEDGE ]

  客戶(hù)端通過(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)銷(xiāo),所以只有客戶(hù)端能容忍重復(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è)線(xiàn)程(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);



作者:傳智播客JavaEE培訓(xùn)學(xué)院

首發(fā):http://java.itcast.cn

0 分享到:
和我們?cè)诰€(xiàn)交談!