免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
用ActiveMQ遇到的消息確認問題

用ActiveMQ遇到的消息確認問題

問題:我的ActiveMQ接收消息用的是topic模式,持久化訂閱,問題是我用了JMS接收消息的代碼每次重新啟動總是會收到最后一次的消息,但這些消息是已經(jīng)接收過了的,而且啟動一次就收到一次,難道ActiveMQ不會清除緩存的嗎?
Java代碼
  1. //創(chuàng)建JMS連接和會話   
  2. ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(url);      
  3. connection = factory.createConnection();      
  4. connection.setClientID(Constant.JMS_CLIENT_ID);      
  5. session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);   
  6. // 創(chuàng)建消息發(fā)送主題和發(fā)送者   
  7. Topic jmsSendTopic = session.createTopic(sendTopic);   
  8. sendTopicProducer = session.createProducer(jmsSendTopic);   
  9. sendTopicProducer.setDeliveryMode(DeliveryMode.PERSISTENT);   
  10. sendTopicProducer.setTimeToLive(Message.DEFAULT_TIME_TO_LIVE);   
  11. // 創(chuàng)建消息接收主題和接收者   
  12. Topic jmsReceiveTopic = session.createTopic(receiveTopic);   
  13. receiveTopicConsumer = session.createDurableSubscriber(jmsReceiveTopic,Constant.JMS_SUBSCRIBE_NAME);   
  14. receiveTopicConsumer.setMessageListener(this);   
  15. connection.start();    

解答:問題原因在于這段代碼在接收到JMS消息時不會向ActiveMQ服務器確認消息的接收,故而ActiveMQ服務器一直認為該消息沒有成功發(fā)送給接收者,因而每次接收者重啟之后就會收到ActiveMQ服務器發(fā)送過來的消息。在這里要解釋一下session的創(chuàng)建。
Java代碼
  1. session = connection.createSession(true,Session.Auto_ACKNOWLEDGE);  

當createSession第一個參數(shù)為true時,表示創(chuàng)建的session被標記為transactional的,確認消息就通過確認和校正來自動地處理,第二個參數(shù)應該是沒用的。
Java代碼
  1. session = connection.createSession(false,Session.Auto_ACKNOWLEDGE);  

當createSession的第一個參數(shù)為false時,表示創(chuàng)建的session沒有標記為transactional,此時有三種用于消息確認的選項:
**AUTO_ACKNOWLEDGE session將自動地確認收到的一則消息;
**CLIENT_ACKNOWLEDGE 客戶端程序將確認收到的一則消息,調用這則消息的確認方法;
**DUPS_OK_ACKNOWLEDGE 這個選項命令session“懶散的”確認消息傳遞,可以想到,這將導致消息提供者傳遞的一些復制消息可能出錯。

JMS有兩種消息傳遞方式。標記為NON_PERSISTENT的消息最多傳遞一次,而標記為PERSISTENT的消息將使用暫存后再轉發(fā)的機理投遞。如果一個JMS服務離線,那么持久性消息不會丟失,但是得等到這個服務恢復聯(lián)機的時候才會被傳遞。所以默認的消息傳遞方式是非持久性的,雖然使用非持久性消息可能降低內存和需要的存儲器,但這種傳遞方式只有當你不需要接收所有消息時才使用。
因此正確的代碼只需改動一處就行了,即將true改為false
Java代碼
  1. //創(chuàng)建JMS連接和會話   
  2. ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(url);      
  3. connection = factory.createConnection();      
  4. connection.setClientID(Constant.JMS_CLIENT_ID);      
  5. session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);   
  6. // 創(chuàng)建消息發(fā)送主題和發(fā)送者   
  7. Topic jmsSendTopic = session.createTopic(sendTopic);   
  8. sendTopicProducer = session.createProducer(jmsSendTopic);   
  9. sendTopicProducer.setDeliveryMode(DeliveryMode.PERSISTENT);   
  10. sendTopicProducer.setTimeToLive(Message.DEFAULT_TIME_TO_LIVE);   
  11. // 創(chuàng)建消息接收主題和接收者   
  12. Topic jmsReceiveTopic = session.createTopic(receiveTopic);   
  13. receiveTopicConsumer = session.createDurableSubscriber(jmsReceiveTopic,Constant.JMS_SUBSCRIBE_NAME);   
  14. receiveTopicConsumer.setMessageListener(this);   
  15. connection.start();    

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ActiveMQ入門篇
深入掌握JMS(七):DeliveryMode例子
深入掌握JMS
手把手教你如何玩轉消息中間件(ActiveMQ)
ActiveMQ的消息持久化到Mysql數(shù)據(jù)庫
【Active入門
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服