1. 程式人生 > >rabbitmq丟訊息的處理方法

rabbitmq丟訊息的處理方法

我們在本地模擬了wms傳送打標訊息的場景.

1. 有事務

2. 先發點對點佇列, 再發訂閱佇列

3. 批量傳送

4. 在生產環境與測試環境的RabbitMQ都進行了測試

我們在測試的時候都沒有出現丟失佇列的情況.

 1、在RabbitMQ配置檔案中,開啟確認機制,如下:

<rabbit:connection-factory id="connectionFactory" publisher-confirms="true" addresses="${rabbitmq.host}" />

2、關閉amqpTemplate的事務(因為RabbitMQ官網給出的註釋是confirm機制在事務情況下是不行的),如下圖:

<rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
channel-transacted="false" message-converter="jsonMessageConverter"/>

3、做完這些操作以後,在程式碼中可以如下啟用confirm方式, 這其中confirm中的ack如果為true,可以認為是RabbitMQ伺服器已經成功接收了訊息:

  rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
          @Override
          public void confirm(CorrelationData correlationData, boolean ack) {
              System.err.println(correlationData.getId() + ack);
          }
          });
 
/**
 * 
 * @Title: callJMSclient
 * @Description: TODO(傳送打標的JMS通知資訊)
 * @param @param textMessage
 * @param @return 設定檔案
 * @return List<String> lstCommNo 商品編碼List
 * @throws
 */
@Transactional(propagation = Propagation.NOT_SUPPORTED)
private void callJMSclient(String msg) {
 try {
//  rabbitTemplate.convertAndSend("wms.test.queue_direct", msg);
//  logger.info("+++p2p:["+msg+"]+++");
 rabbitTemplate.convertAndSend("amq.topic", "test.wms.usablestoragechanged.topic", msg,new CorrelationData("success:["+msg+"]"));
 logger.info("&&&p2s:["+msg+"]&&&");
 }catch (Exception e){
 logger.info("=============error:["+e.getMessage()+"]=========");
 }
}

這樣就可以在日誌裡檢視有沒有訊息傳送失敗。

令我們奇怪的是,當把事務去掉以後的,訊息就不再丟失了,具體原因還待分析,先把訊息確認的方法記錄下哈。