RabbitMQ 消息确认机制处理: 发送者消息确认

两步:

1. 配置 yaml 文件,打开确认机制的配置

2. 实现 return callback 

                return callback 一个 template 仅有一次即可;即在启动时注入。

配置的信息

有三个类型

none — 关闭配置

simple — 阻塞式

correlated — 异步

通常开启 异步处理 — correlated 。

配置完整信息 —— 最后两个配置项

spring:
  rabbitmq:
    host: 
    port:
    virtual-host: /shopping
    username: goods
    password:
    connection-timeout: 1s
    template:
      retry:
        enabled: true
        initial-interval: 1000ms
        multiplier: 1
        max-attempts: 3
    publisher-confirm-type: correlated    # 异步  | none 关闭 confirm | simple 阻塞
    publisher-returns: true

代码

每次发送消息,都需要制定指定 confirm callback 

ReturnCallback

@Configuration
@Slf4j
@RequiredArgsConstructor
public class MQConfig {

    private final RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init() {
        rabbitTemplate.setReturnsCallback(returnedMessage -> {
            log.error(" Listener _ return callback");
            log.debug("Exchange: {}",returnedMessage.getExchange());
            log.debug("Message: {}",returnedMessage.getMessage());
            log.debug("routingKey: {}",returnedMessage.getRoutingKey());
            log.debug("replyCode: {}",returnedMessage.getReplyCode());
            log.debug("replyText: {}",returnedMessage.getReplyText());
        });
    }
}

ConfirmCallback

先看结果 — 发送成功

编辑器成功结果提示

代码的配置信息参考这里: Direct exchange 定向路由,根据规则分配 Queue 消息,Spring AMQP-CSDN博客

application.yml 文件的配置,如上。

@SpringBootTest
@Slf4j
public class SpringAMQPTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void confirmCallbackTest() {

        CorrelationData cd = new CorrelationData(UUID.randomUUID().toString());
        cd.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {
            @Override
            public void onFailure(Throwable ex) {
                log.error("SpringAMQP 异常,",ex.getMessage(), ex);
            }

            @Override
            public void onSuccess(CorrelationData.Confirm result) {
                if(result.isAck()) {
                    log.debug("confirm callback , message is right");
                }else {
                    log.debug("confirm callback , message is not right", result.getReason());
                }

                // 消息重发

            }
        });

        String exchangeName = "direct.exchange";
        String routingKey = "one";

        String message = "如花似锦的年纪";

        rabbitTemplate.convertAndSend(exchangeName, routingKey, message,cd);

    }
}

注意⚠️: 错误信息处理

return callback 错误信息,RabbitMQ -CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值