【问题标题】:How to confirm RabbitMQ messages with Java?如何使用 Java 确认 RabbitMQ 消息?
【发布时间】:2017-02-12 10:01:26
【问题描述】:

我试图弄清楚如何在 java 中确认消息,但我不明白。
这是官方的 RabbitMQ 示例:
http://hg.rabbitmq.com/rabbitmq-java-client/file/default/test/src/com/rabbitmq/examples/ConfirmDontLoseMessages.java

问题是他们使用 10000 条消息发送到队列,然后才等待确认所有消息。我需要发送 1 条消息,每个线程只发送一条消息并确认(在我的情况下,我有几个平等的发布者必须不时发送消息)。如何确认一条消息(不是确认所有消息)?

我需要类似的东西:

for (long i = 0; i < MSG_COUNT; ++i) {
    ch.basicPublish("", QUEUE_NAME,
                   MessageProperties.PERSISTENT_BASIC,
                   "nop".getBytes());
    ch.wait_for_confirm();
    if(ch.isConfirmed){
        //OK
    }
    else{
        //Republish
    }
}

【问题讨论】:

    标签: java queue rabbitmq client confirmation


    【解决方案1】:

    您应该需要为每条消息使用确认,您可以查看以下链接: https://www.rabbitmq.com/confirms.html

    【讨论】:

    【解决方案2】:

    阅读这篇文章:

    http://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms/

    简而言之,您可以使用tx-transactions ch.txSelect(); for (int i = 0; i < MSG_COUNT; ++i) { ch.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_BASIC, "nop".getBytes()); ch.txCommit(); }

    publish-confirmation 处理程序:

    ch.addConfirmListener(new ConfirmListener() {....}

    第一个比第二个更容易但慢。

    【讨论】:

    • 有 waitForConfirms() 方法:link 注意,你必须将频道设置为“确认模式”:channel.confirmSelect()