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

全國咨詢/投訴熱線:400-618-4000

AcitveMQ的事物以及簽收方式

更新時間: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);



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

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

0 分享到:
和我們在線交談!