乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      用ActiveMQ遇到的消息確認(rèn)問題

       kekokeko 2010-12-29

      用ActiveMQ遇到的消息確認(rèn)問題

      問題:我的ActiveMQ接收消息用的是topic模式,持久化訂閱,問題是我用了JMS接收消息的代碼每次重新啟動總是會收到最后一次的消息,但這些消息是已經(jīng)接收過了的,而且啟動一次就收到一次,難道ActiveMQ不會清除緩存的嗎?
      Java代碼 復(fù)制代碼
      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服務(wù)器確認(rèn)消息的接收,故而ActiveMQ服務(wù)器一直認(rèn)為該消息沒有成功發(fā)送給接收者,因而每次接收者重啟之后就會收到ActiveMQ服務(wù)器發(fā)送過來的消息。在這里要解釋一下session的創(chuàng)建。
      Java代碼 復(fù)制代碼
      1. session = connection.createSession(true,Session.Auto_ACKNOWLEDGE);  

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

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

      JMS有兩種消息傳遞方式。標(biāo)記為NON_PERSISTENT的消息最多傳遞一次,而標(biāo)記為PERSISTENT的消息將使用暫存后再轉(zhuǎn)發(fā)的機(jī)理投遞。如果一個JMS服務(wù)離線,那么持久性消息不會丟失,但是得等到這個服務(wù)恢復(fù)聯(lián)機(jī)的時候才會被傳遞。所以默認(rèn)的消息傳遞方式是非持久性的,雖然使用非持久性消息可能降低內(nèi)存和需要的存儲器,但這種傳遞方式只有當(dāng)你不需要接收所有消息時才使用。
      因此正確的代碼只需改動一處就行了,即將true改為false
      Java代碼 復(fù)制代碼
      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();    

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多