最近發現系統rabbitmq丟消息比較嚴重,于是想了些方案來查找原因,給將消息發送方式添加確認機制。
3、做完這些操作以后,在代碼中可以如下啟用confirm方式, 這其中confirm中的ack如果為true,可以認為是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"/> |
? 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()+"]========="); ?} } |
這樣就可以在日志里查看有沒有消息發送失敗。
令我們奇怪的是,當把事務去掉以后的,消息就不再丟失了,具體原因還待分析,先把消息確認的方法記錄下哈。