clean channel shutdown(消息发送成功,ConfirmCallback ack返回为false)

本文介绍在使用Spring Boot整合RabbitMQ时,解决消息发送后确认回调因资源关闭而导致的问题。通过在测试方法中增加等待时间,确保异步确认回调能够正常执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

clean channel shutdown; protocol method: #method<channel.close>(reply-code=200, reply-text=OK, class-id=0, method-id=0)

视频出现的问题

@Component
public class RabbitSender {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    final RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
        @Override
        public void confirm(CorrelationData correlationData, boolean ack, String cause) {
            System.err.println("correlationData: " + correlationData);
            System.err.println("ack: " + ack);
            if(!ack){
                System.err.println("异常处理...." + cause);
            }
        }
    };

    final ReturnCallback returnCallback = new RabbitTemplate.ReturnCallback() {
        @Override
        public void returnedMessage(org.springframework.amqp.core.Message message, int replyCode, String replyText,
                                    String exchange, String routingKey) {
            System.err.println("return exchange: " + exchange + ", routingKey: "
                    + routingKey + ", replyCode: " + replyCode + ", replyText: " + replyText);
        }
    };

    public void send(Object message, Map<String, Object> properties) throws Exception {
        MessageHeaders mhs = new MessageHeaders(properties);
        Message msg = MessageBuilder.createMessage(message, mhs);
        rabbitTemplate.setConfirmCallback(confirmCallback);
        rabbitTemplate.setReturnCallback(returnCallback);
        CorrelationData correlationData = new CorrelationData("1234567890");
        rabbitTemplate.convertAndSend("exchange.1", "springboot.test", msg, correlationData);
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {


    @Autowired
    private RabbitSender sender;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    @Test
    public void send() throws Exception {
        Map<String, Object> properties = new HashMap<>();
        properties.put("number", "12345");
        properties.put("send_time", simpleDateFormat.format(new Date()));
        sender.send("Hello RabbitMQ For Spring Boot!", properties);
    }
}

在这里插入图片描述
网上查阅了半天没找到解决问题的,后来想了一下,我是在测试方法中进行测试,当测试方法结束,rabbitmq相关的资源也就关闭了,虽然我们的消息发送出去,但异步的ConfirmCallback却由于资源关闭而出现了上面的问题
所以在测试方法等待一段时间即可

@Test
public void send() throws Exception {
    Map<String, Object> properties = new HashMap<>();
    properties.put("number", "12345");
    properties.put("send_time", simpleDateFormat.format(new Date()));
    sender.send("Hello RabbitMQ For Spring Boot!", properties);
    Thread.sleep(2000);
}

在这里插入图片描述

可以看到成功了!

channel.shutdown()channel.shutdownNow() 都是 ManagedChannel 接口中的方法,用于关闭连接。它们的区别在于关闭连接的方式不同。 - channel.shutdown() 方法会优雅地关闭连接。在关闭连接时,该方法会先发送一个关闭信号给服务器,然后等待所有请求处理完成后再关闭连接。这个过程可能需要一定的时间,但是可以确保所有请求都被正常处理完毕。因此,我们通常会在使用 channel.shutdown() 方法时,再调用 awaitTermination() 方法等待连接关闭。 - channel.shutdownNow() 方法会强制关闭连接。在关闭连接时,该方法会立即中断所有正在处理的请求,并关闭连接。这个过程非常快,但是可能会导致一些请求没有被正常处理完毕。因此,我们通常不建议使用 channel.shutdownNow() 方法,除非必须要立即关闭连接。 示例代码如下: ``` ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080).usePlaintext().build(); // 创建 gRPC 客户端 // 发送请求并处理响应 channel.shutdown(); // 优雅地关闭连接 try { channel.awaitTermination(5, TimeUnit.SECONDS); // 等待连接关闭,最多等待 5 秒 } catch (InterruptedException e) { e.printStackTrace(); } // 或者使用 channel.shutdownNow() 强制关闭连接 // channel.shutdownNow(); ``` 在上面的示例中,我们首先创建了一个 ManagedChannel 对象,然后发送请求并处理响应。在程序退出之前,我们调用了 channel.shutdown() 方法来优雅地关闭连接,并使用 channel.awaitTermination() 方法等待连接关闭。如果需要强制关闭连接,可以使用 channel.shutdownNow() 方法。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值