RabbitMQ 消息确认方式

2019-03-05 23:00|来源: 网路

消费者从队列中获取消息,服务端如何知道消息已经被消费呢?


模式1:自动确认

        只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。
模式2:手动确认
        消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。


通过channel获取消费者的时候,第二个参数如果是true表示自动确认,如果是false表示要手动确认,如查是手动确认,通过channel的basicAck方法返回确认

channel.basicConsume(QUEUE_NAME, false, consumer);
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);


手动模式示例:

@Test
public void testRecv1() throws Exception {
    // 获取到连接以及mq通道
    Connection connection = ConnectionUtil.getConnection();
    Channel channel = connection.createChannel();
    // 声明队列
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    // 同一时刻服务器只会发一条消息给消费者
    channel.basicQos(1);
    // 定义队列的消费者
    QueueingConsumer consumer = new QueueingConsumer(channel);
    // 监听队列,手动返回完成
    channel.basicConsume(QUEUE_NAME, false, consumer);
    // 获取消息
    while (true) {
        QueueingConsumer.Delivery delivery = consumer.nextDelivery();
        String message = new String(delivery.getBody());
        System.out.println(" [x] Received '" + message + "'");
        //休眠
        Thread.sleep(10);
        // 返回确认状态
        channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
    }
}


自动模式示例:
@Test
public void testRecv() throws Exception{
    // 获取到连接以及mq通道
    Connection connection = ConnectionUtil.getConnection();
    Channel channel = connection.createChannel();
    // 声明队列
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    // 定义队列的消费者
    QueueingConsumer consumer = new QueueingConsumer(channel);
    // 监听队列
    channel.basicConsume(QUEUE_NAME, true, consumer);
    // 获取消息
    while (true) {
        QueueingConsumer.Delivery delivery = consumer.nextDelivery();
        String message = new String(delivery.getBody());
        System.out.println(" [x] Received '" + message + "'");
    }
}


书生整理于网络


相关问答

更多

RabbitMQ重新排序消息(RabbitMQ reordering messages)

由于没有答复,我想我做得很好;) 无论如何,在与其他利益相关者讨论要求后,决定现在可以放弃LIFO要求。 当涉及到它时,我们可以担心。 我们可能最终采用的解决方案是让工作人员打开第二个队列,让主人可以使用该队列让工作人员知道要忽略哪些工作,并提供额外的控制/监视信息(无论如何我们都需要这些信息)。 实现AMQP 1.0规范的RabbitMQ也可能对此有所帮助。 所以我会把这个问题标记为现在的答案。 其他人仍然可以自由添加或改进。 Since there is no reply I guess I ...

spring rabbitmq怎么关闭消息的自动确认

1.需要“消息延迟”功能这对我们来说是很重要的业务需求。当顾客订了一个服务,首先我们会发送描述相信指令的短信,然后我们会在两分钟后发送第二条描述详情的短信,而不是两条一起发送。我们希望通过这样,留给用户阅读的时间(每次间隔2分钟)

spring rabbitmq怎么关闭消息的自动确认

<rabbit:listener-container connection-factory="connectionFactory" concurrency="4" acknowledge="manual" max-concurrency="4" prefetch="1" error-handler="errorHandler"> <rabbit:listener ref="generatorConsumer" method="onMessage" queues="${rabbitmq.queue} ...

Wildfly的RabbitMQ配置(RabbitMQ configuration for Wildfly)

我的赏金即将到期,直到现在我还没有看到帮助。 所以,我按照我的经验回答。 来自问题: 任何帮助,即使答案是 - 这是不可能的 - 会很好。 不知道,但我们不需要那样做。 为此我找到了解决办法。 答案是 运行RABBITMQ的自有服务器 我跟着这个链接在Ubuntu服务器上安装它。 然后我阅读这些真棒和简单的教程。 这六个教程是开始的很好的基础。 我现在将该项目与在Wildfly 9服务器上运行的Java EE项目集成。 祝好运的人都来到了这里。 欢迎任何有建设性的编辑和答案。 My bounty ...

相关文章

更多

最近更新

更多