【发布时间】:2017-03-16 22:03:52
【问题描述】:
根据http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#acknowledge()
客户端可以在每条消息被消费时单独确认,或者它可以选择将消息确认为应用程序定义的组(这是通过对组的最后接收到的消息调用确认来完成的,从而确认被消费的所有消息会议。)
如何在 ActiveMQ 中做到这一点?我无法让它工作。
【问题讨论】:
根据http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#acknowledge()
客户端可以在每条消息被消费时单独确认,或者它可以选择将消息确认为应用程序定义的组(这是通过对组的最后接收到的消息调用确认来完成的,从而确认被消费的所有消息会议。)
如何在 ActiveMQ 中做到这一点?我无法让它工作。
【问题讨论】:
在与马特·帕夫洛维奇 (Matt Pavlovich) 进行以下交流后,我正在纠正我的答案。
CLIENT_ACKNOWLEDGE:使用此选项,客户端确认消息 通过调用消息的确认方法。确认消费 消息自动确认收到的所有消息 已由其会话交付。
因此,CLIENT_ACKNOWLEDGE 选项不能用于向 JMS 提供者发送单个消息的确认。
您可以在此处查看规范:
http://download.oracle.com/otndocs/jcp/jms-2_0-fr-eval-spec/index.html
【讨论】:
这里是 ActiveMQ 客户端的示例,
import javax.jms.Connection;
import javax.jms.JMSException;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQMessageConsumer;
import org.apache.activemq.ActiveMQSession;
import org.apache.activemq.command.ActiveMQTextMessage;
public class SimpleConsumer {
public static void main(String[] args) throws JMSException {
Connection conn = null;
try {
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
conn = cf.createConnection("consumer", "consumer");
ActiveMQSession session = (ActiveMQSession) conn.createSession(false,
ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);
ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer) session
.createConsumer(session.createQueue("QUEUE"));
conn.start();
ActiveMQTextMessage msg = null;
while ((msg = (ActiveMQTextMessage) consumer.receive()) != null) {
System.out.println("Received message is: " + msg.getText());
msg.acknowledge();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
}
}
}
}
}
【讨论】: