RabbitMQ消息手动应答(注意事项)

本文介绍了一种消息队列中手动确认消息的方法,通过对比自动应答方式,演示了如何利用手动应答来确保消息不丢失。具体案例包括两个消费者线程的不同消费速度及消息重新分配机制。
摘要由CSDN通过智能技术生成

手动应答案例

默认消息采用的是自动应答,所以我们要想实现消息消费过程中不丢失,需要把自动应答改为手动应答

消费者启用两个线程,消费 1 一秒消费一个消息,消费者 2 十秒消费一个消息,然后在消费者 2 消费消息的时候,停止运行,这时正在消费的消息是否会重新进入队列,而后给消费者 1 消费呢?

  • 工具类
public class SleepUtils {
    public static void sleep(int second){
        try {
            Thread.sleep(1000*second);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

### RabbitMQ 手动应答实现方式 在RabbitMQ中,当消费者接收到并处理一条消息后,可以通过手动确认的方式告知服务器这条消息已被成功处理。这种方式可以确保即使消费者意外终止也不会丢失任何未处理的消息。 #### 配置监听容器以支持手动签收模式 要启用手动应答功能,在配置`SimpleMessageListenerContainer`时需设置其属性`acknowledgeMode`为`MANUAL`: ```java @Bean public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setQueueNames("test.queue"); container.setMessageListener(listenerAdapter); // 设置为手动签收模式 container.setAcknowledgeMode(AcknowledgeMode.MANUAL); return container; } ``` #### 编写带有手动确认逻辑的消费者代码 下面是一个简单的Java方法来展示如何编写能够执行手动应答操作的服务端程序片段: ```java @Component public class Receiver { private static final Logger LOGGER = LoggerFactory.getLogger(Receiver.class); @RabbitListener(queues = "hello") public void receive(String in, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { try{ System.out.println(" [x] Received '" + in + "'"); // 处理业务逻辑 // 成功处理完毕后发送基本确认命令给Broker channel.basicAck(tag, false); // 单条消息确认 // 或者使用 basicNack 来拒绝或重新排队消息 // channel.basicNack(tag, false, true/false); } catch (Exception e){ // 如果发生异常可以选择性的回滚事务或者让消息重回队列等待下次投递 channel.basicReject(tag, true); throw e; } } } ``` 在这个例子中,每当有新的消息到达指定队列时就会触发接收函数`receive()`。此函数会打印出所接受到的内容,并调用`basicAck()`来进行单个消息的手工确认;如果遇到错误,则通过`basicReject()`使消息返回至队首以便稍后再试[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值