【问题标题】:ActiveMQ - is it possible to acknowledge single message in CLIENT_ACKNOWLEDGE modeActiveMQ - 是否可以在 CLIENT_ACKNOWLEDGE 模式下确认单个消息
【发布时间】:2017-03-16 22:03:52
【问题描述】:

根据http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#acknowledge()

客户端可以在每条消息被消费时单独确认,或者它可以选择将消息确认为应用程序定义的组(这是通过对组的最后接收到的消息调用确认来完成的,从而确认被消费的所有消息会议。)

如何在 ActiveMQ 中做到这一点?我无法让它工作。

【问题讨论】:

    标签: jms activemq


    【解决方案1】:

    在与马特·帕夫洛维奇 (Matt Pavlovich) 进行以下交流后,我正在纠正我的答案。

    CLIENT_ACKNOWLEDGE:使用此选项,客户端确认消息 通过调用消息的确认方法。确认消费 消息自动确认收到的所有消息 已由其会话交付。

    因此,CLIENT_ACKNOWLEDGE 选项不能用于向 JMS 提供者发送单个消息的确认。

    您可以在此处查看规范:

    http://download.oracle.com/otndocs/jcp/jms-2_0-fr-eval-spec/index.html

    【讨论】:

    • 感谢您的回复,我犯了一个错误,因为 Sun Java™ System Message Queue 是一个特定的实现。我正在寻找 ActiveMQ 中的等价物。
    • 不推荐 CLIENT_ACKNOWLEDGE。它确认当前消息和所有以前的消息——包括可能在其他线程中运行的消费者正在传输的消息。
    • 我没听说过,你能提供一个参考吗?
    • JMS API 规范 4.4.11 ... CLIENT_ACKNOWLEDGE - 使用此选项,客户端通过调用消息的确认方法来确认消息。确认消费的消息会自动确认已收到其会话已传递的所有消息。
    【解决方案2】:

    这里是 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) {
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 我正在寻找一种只确认一条消息的方法。
    • 所以 ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE 就是问题所在。谢谢-我同时发现了:)
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 2011-04-17
    • 2013-08-28
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多