一、事務性會話:當一個事務被提交的時候,確認自動發生
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。