Jms ActiveMQ-是否可以在客户端确认模式下确认单个消息

Jms ActiveMQ-是否可以在客户端确认模式下确认单个消息,jms,activemq,Jms,Activemq,据 客户端可以在消息被消费时单独确认消息,也可以选择将消息作为应用程序定义的组进行确认(通过对组的最后一条消息调用确认来完成,从而确认会话所消费的所有消息) 如何在ActiveMQ中执行此操作?我无法让它工作。在马特·帕夫洛维奇发表以下评论后,我正在更正我的答案 客户端确认:使用此选项,客户端确认消息 通过调用消息的确认方法。确认已消费 消息自动确认接收到所有已发送的消息 已在本届会议上发言 因此,客户端确认选项不能用于向JMS提供程序发送单个消息的确认。 您可以在此处查看规范: 下面是Acti

客户端可以在消息被消费时单独确认消息,也可以选择将消息作为应用程序定义的组进行确认(通过对组的最后一条消息调用确认来完成,从而确认会话所消费的所有消息)


如何在ActiveMQ中执行此操作?我无法让它工作。

在马特·帕夫洛维奇发表以下评论后,我正在更正我的答案

客户端确认:使用此选项,客户端确认消息 通过调用消息的确认方法。确认已消费 消息自动确认接收到所有已发送的消息 已在本届会议上发言

因此,客户端确认选项不能用于向JMS提供程序发送单个消息的确认。

您可以在此处查看规范:


下面是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) {
                }
            }
        }
    }
}

谢谢你的回复,我犯了一个错误,因为Sun Java™ 系统消息队列是一个特定的实现。我正在寻找ActiveMQ中的等效项。不建议使用客户端。它是当前消息和所有以前的消息--包括可能在其他线程中运行的消费者正在传递的消息。我从未听说过这一点,您能提供此消息的参考吗?JMS API规范4.4.11。。。客户端确认-使用此选项,客户端通过调用消息的确认方法来确认消息。确认已使用的消息会自动确认其会话已发送的所有消息的接收。我正在寻找一种只确认单个消息的方法。因此ActiveMQSession.INDIVIDUAL_acknowledge就是这样。谢谢-我同时发现:)