ActiveMQ 消息確認


一、事務性會話當一個事務被提交的時候,確認自動發生

ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.174.104:61616");
        Connection connection = connectionFactory.createConnection();
        connection.start();
        
        Session session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
        Destination queue=session.createQueue("my-queue1");
        
        MessageConsumer  consumer = session.createConsumer(queue);
        
        int i=0;
        while (i<3){
            TextMessage message=(TextMessage) consumer.receive();
            System.out.println(message.getText());
            session.commit();
        }        
                
        session.close();
        connection.close();
        
    }

  如果事務性會話中,不執行 session.commit(),消息不會創建或被消費

 

二、在非事務性會話中:消息何時被確認取決於創建會話時的應答模式(acknowledgement mode)。該參數有以下三個可選值:

Session.AUTO_ACKNOWLEDGE:當客戶成功的從receive方法返回的時候,或者從MessageListener.onMessage方法成功返回的時候,會話自動確認客戶收到的消息。

Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);

Session.CLIENT_ACKNOWLEDGE:客戶通過調用消息的acknowledge方法確認消息。需要注意的是,在這種模式中,確認是在會話層上進行,確認一個被消費的消息
將自動確認所有已被會話消費的消息。例如,如果一個消息消費者消費了10 個消息,然后確認第5 個消息,那么所有10 個消息都被確認。

ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.174.104:61616");
        Connection connection = connectionFactory.createConnection();
        connection.start();
        
        Session session=connection.createSession(Boolean.FALSE, Session.CLIENT_ACKNOWLEDGE);
        Destination queue=session.createQueue("my-queue2");
        
        MessageConsumer  consumer = session.createConsumer(queue);
        
        int i=0;
        while (i<3){
            TextMessage message=(TextMessage) consumer.receive();
            //System.out.println(message.getStringProperty("queue"));
            System.out.println(message.getText());
            //session.commit();
            
            if(i==2){ message.acknowledge(); }
            
            i++;
            
        }        
                
        session.close();
        connection.close();
        
    }

Session.DUPS_ACKNOWLEDGE:該選擇只是會話遲鈍的確認消息的提交。如果JMS provider失敗,那么可能會導致一些重復的消息。如果是重復的消息,那么JMS provider 必須把消息頭的JMSRedelivered字段設置為true。

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM