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

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

AcitveMQ的事物以及簽收方式

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

  ActiveMQ 是支持事務的

  /**

  * 通過Connection對象創(chuàng)建Session會話,用于接收消息。

  * 參數(shù)1:是否啟用事務 * 參數(shù)2:簽收模式,默認設置為自動簽收

  */

  Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);是否添加事務的區(qū)別

  

  MQ的簽收方式【三種簽收方式】

  [ Session.AUTO_ACKNOWLEDGE ]

  當客戶端從receiver或onMessage成功返回時,Session自動簽收客戶端的這條消息的收條。

  [ Session.CLIENT_ACKNOWLEDGE ]

  客戶端通過調(diào)用消息(Message)的acknowledge方法簽收消息。

  在這種情況下,簽收發(fā)生在Session層面:

  簽收一個已經(jīng)消費的消息會自動地簽收這個Session所有已消費的收條。

  [ Session.DUPS_OK_ACKNOWLEDGE ]

  Session不必確保對傳送消息的簽收,這個模式可能會引起消息的重復,但是降低了Session的開銷,所以只有客戶端能容忍重復的消息,才可使用。

  [Session.CLIENT_ACKNOWLEDGE 簽收方式】

  一般來說 要求消息能夠準確送達的 都用第二種手動簽收方式對消息送達率要求不是十分精確的都用第一種默認的自動簽收

  ***注意手動簽收需要調(diào)用 msg.acknowledge();方法

  告訴mq的服務器 消息已經(jīng)簽收這個消息才會被消費掉

  while(true){

  TextMessage msg =(TextMessage)messageConsumer.receive();

  //消費者手工去簽收消息,另起一個線程(TCP)去通知MQ服務確認消息簽收

  msg.acknowledge();

  if(msg==null)

  break;

  System.out.println("【消費者接收】"+msg.getText());

  }

  ***在手動簽收的情況下 如果生產(chǎn)者生產(chǎn)消息開啟了事務那個在消費者消費消息的時候就不用開啟事務

  消費者的session與生產(chǎn)者的session簽收模式保持一致,

  注意,生產(chǎn)者啟用事務了,但是消費者這里事務不要啟用,不然會一直消費例如:

  //生產(chǎn)者session

  //開啟事務

  //手動簽收

  Session session= connection.createSession(Boolean.TRUE,Session.CLIENT_ACKNOWLEDGE);

  //消費者session

  //關閉事務

  //手動簽收Session session =connection.createSession(Boolean.FALSE, Session.CLIENT_ACKNOWLEDGE);



作者:傳智播客JavaEE培訓學院

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

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