rabbitmq丟訊息的處理方法
阿新 • • 發佈:2019-01-29
我們在本地模擬了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()+"]========="); } } |
這樣就可以在日誌裡檢視有沒有訊息傳送失敗。
令我們奇怪的是,當把事務去掉以後的,訊息就不再丟失了,具體原因還待分析,先把訊息確認的方法記錄下哈。