spring-rabbitmq Publisher Confirms Return模式

前言

在使用rabbitmq时有时我们需要保证消息有没有成功传递,消息有没有正常到达broker,消息有没有由exchange分配到队列。

一、Publisher-Confirm

Publisher-Confirm是我们验证消息有没有顺利到达rabbit的broker,而之后消息有没有通过exchange路由到队列,不在此次验证的范围。

在spring-rabbitmq实现Publisher-Confirm机制
CachingConnectionFactory设置
开启PublisherConfirms

factory.setPublisherConfirms(true);

异步确认
RabbitTemplate设置
配置Confirm消息确认回调,实现RabbitTemplate.ConfirmCallback中的confirm方法

//消息确认collback
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                System.out.println(Thread.currentThread().getName());
                //
                System.out.println("cd:"+correlationData.getId());
                System.out.println(ack);
                System.out.println(cause);
            }
        });

confirm方法中correlationData对象,可通过rabbitTemplate.send或convertAndSend传递,里面存放了一个id,
里面有个future对象,通过这个future我们大概能猜出他要实现什么功能。

同步确认

CorrelationData correlationData=new CorrelationData(UUID.randomUUID().toString());
 rabbitTemplate.convertAndSend("exchange","Key", object, correlationData);
 CorrelationData.Confirm confirm = correlationData.getFuture().get();

调用correlationData.getFuture().get()会等待直到生产者收到ack信号,当然也可以设置timeout。

二、Publisher-Return

上面我面介绍了消息确认机制,但只能保证消息正常到达broker,但不能保证消息有没有正确路由到相应的队列。
Return可以用来验证这一点。
与confirm类似

在spring-rabbitmq实现Publisher-Return机制

CachingConnectionFactory设置
开启PublisherConfirms

factory.setPublisherReturns(true);

RabbitTemplate设置

rabbitTemplate.setMandatory(true);

mandatory代表强制发送,即使exchange找不到routingkey对应的队列也会尝试,如果失败则会回调ReturnCallback

ReturnCallback
实现RabbitTemplate.ReturnCallback.returnedMessage(Message message, int replyCode, String replyText,
String exchange, String routingKey)

rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText,
				String exchange, String routingKey) {
                ....
            }
        });

replyCode 错误码 312代表没找到队列
replyText 错误信息 NO_ROUT

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot 中使用 RabbitMQ 时,我们可以通过在配置文件中配置绑定关系,将交换机和队列进行绑定。具体步骤如下: 1. 在 application.properties 或 application.yml 中配置 RabbitMQ 连接信息: ``` spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 2. 创建一个交换机和一个队列,并将它们绑定在一起: ``` @Configuration public class RabbitConfig { @Bean public Queue queue() { return new Queue("myqueue", true); } @Bean public DirectExchange exchange() { return new DirectExchange("myexchange"); } @Bean public Binding binding(Queue queue, DirectExchange exchange) { return BindingBuilder.bind(queue).to(exchange).with("mykey"); } } ``` 3. 在需要发送消息的地方,注入 RabbitTemplate 并调用 convertAndSend 方法: ``` @Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String message) { rabbitTemplate.convertAndSend("myexchange", "mykey", message); } ``` 4. 在需要接收消息的地方,注入 SimpleMessageListenerContainer 并实现 MessageListener 接口: ``` @Autowired private Queue queue; @Bean public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setQueueNames(queue.getName()); container.setMessageListener(listenerAdapter); return container; } @Bean public MessageListenerAdapter listenerAdapter() { return new MessageListenerAdapter(new MyMessageListener()); } public class MyMessageListener implements MessageListener { @Override public void onMessage(Message message) { String body = new String(message.getBody()); System.out.println("Received message: " + body); } } ``` 通过以上步骤,我们就可以实现交换机和队列的绑定,以及在队列中发送和接收消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值