【问题标题】:Acknowledge receipt of producer message by client确认客户端收到生产者消息
【发布时间】:2013-02-22 05:13:17
【问题描述】:

我有一个实现消息生产者的 Java 类,它将消息发送到名为 test 的队列。我有另一个类作为客户端,它从同一个队列中获取消息。我对如何知道客户端是否已收到消息感到困惑。我在某处读到我应该使用message.acknowledge(),但我不知道执行此操作的正确方法。我的代码如下所示:

制作人:

public class Producer {
    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;

    private static String subject = "que";

    public static void main(String[] args) throws JMSException,
            InterruptedException {

        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        Connection connection = connectionFactory.createConnection();
        connection.start();

        Session session = connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);

        Destination destination = session.createQueue(subject);

        MessageProducer producer = session.createProducer(destination);

        // 
        int i = 0;
        //while(true)
        // {
        TextMessage message = session
                .createTextMessage("this is a gfjfjf " + i);
        Thread.sleep(2000);
        // 
        producer.send(message);
        i++;
        System.out.println("Sent message '" + message.getText() + "'");
        System.out.println(ActiveMQConnection.DEFAULT_BROKER_URL);
        MessageListener ML = session.getMessageListener();
        System.out.println(ML);
        connection.close();
    }
}

消费者:

public class Consumer {

    private static String url = "failover://tcp://192.168.1.17:61616";

    private static String subject = "que";

    public static void main(String[] args) throws JMSException {
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        Connection connection = connectionFactory.createConnection();
        connection.start();

        Session session = connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);

        Destination destination = session.createQueue(subject);

        MessageConsumer consumer = session.createConsumer(destination);

        // while(true)
        //  {
        Message message = consumer.receive();

        System.out.println(message);

        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            System.out.println("Received message '" + textMessage.getText()
                    + "'");
        }
        if (session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) {
            System.out.println(session.getAcknowledgeMode());
            System.out.println(Session.CLIENT_ACKNOWLEDGE);
            message.acknowledge();
        }
        System.out.println(session.getAcknowledgeMode());
        System.out.println(Session.CLIENT_ACKNOWLEDGE);
        message.acknowledge();

    }
}

任何帮助表示赞赏。

【问题讨论】:

  • @Perception 你知道如何解决这个问题吗?
  • 很少使用客户端确认。你需要它有什么特别的原因吗?如果是这样,在您的客户端,使用connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); 创建您的会话。请注意,在自动确认模式下,运行时会为您处理所有这些,包括消息重新传递。
  • @Perception 没问题,但我将如何检查确认
  • @Perception 如果它被确认,那么它会发送一个真/假或任何东西
  • 不,确认模式控制接收者(客户端)和 JMS 提供者(不是消息生产者)之间的交互。在这种情况下,生产者基本上是一劳永逸,让提供者和接收者确定是否需要重新传递消息等。Here 是您可以就该主题做的一些阅读。

标签: java queue jms activemq producer-consumer


【解决方案1】:

您不能使用确认来检查消息是否已收到。

实际上,一般的消息传递,特别是 JMS 的设计目的是使发送应用程序不需要知道消息是否已到达客户端。这个概念被称为保证交付。

致谢是其中的一部分。如果您读取队列的消息但未确认,JMS 代理将在稍后尝试重新传递该消息。您可以使用可以提交或回滚的事务将概念提升到另一个层次。

如果您确实需要邮件的原始发件人的回执,我建议您发送邮件作为回复。 JMS 具有使用相关 id 和 ReplyTo 字段的请求/回复示意图。你可以用谷歌搜索很多例子,但是here is one at EIP

【讨论】:

  • 谢谢,如果您编辑我的代码并按照您说的方式发布,我将非常感谢您
  • 我的回答中的链接中有一个示例。你可能想看看那里。它是简单的 JMS,与您实现的方式相同,因此实现起来应该很简单。
猜你喜欢
  • 1970-01-01
  • 2018-02-27
  • 2015-09-18
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 2013-08-28
  • 2013-05-21
  • 2018-01-20
相关资源
最近更新 更多