RabbitMq-进阶-03-消息的可靠投递

11 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。
		RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。
		rabbitmq 整个消息投递的路径为:
			producer--->rabbitmq broker--->exchange--->queue--->consumer
		
12 confirm 确认模式
		消息从 producer 到 exchange 则会返回一个 confirmCallback 。
	

13 return  退回模式
		消息从 exchange-->queue 投递失败则会返回一个 returnCallback 。
21 确认模式:

22 配置文件开启确认模式:
		#  开启消息的confirm机制
    	publisher-confirms: true

23 使用rabbitTemplate.setConfirmCallback设置回调函数。
 /**
     * @author Echo
     * 生产者的 confirm 模式
     * 生产者的投递路径: producer--->rabbitmq broker--->exchange
     * 具体操作:
     *      1、配置文件中配置 confirm 模式的开启
     *          publisher-confirms: true
     *
     *      2、设置确认回调机制
     *          通过rabbitTemplate.setConfirmCallback(RabbitTemplate.ConfirmCallback confirmCallback)
     *          ConfirmCallback对象对应的参数:
     *              confirm(@NonNull CorrelationData correlationData, boolean ack, @Nullable String cause)
     *              CorrelationData:相关配置信息
     *              ack:exchange交换机是否成功收到了消息。true 成功,false代表失败
     *              cause:失败原因
     */
    @Test
    public void testConfirm(){
        rabbitTemplate.setConfirmCallback((correlationData, b, s) -> {
            System.out.println("confirm 方法被指行了.........");
            if(b){
                System.out.println("接受消息成功" + s);
            }else{
                System.out.println("接受失败" + s);
            }
        });
        // 正常情况
        rabbitTemplate.convertAndSend("springboot_topic_exchange","t1.topic.test","hello springboot topic");
        // 模拟异常
        rabbitTemplate.convertAndSend("springboot_topic_exchange1","t1.topic.test","hello springboot topic");
    }

24 
	运行测试。
31 退回模式:

32 配置文件开启此模式:
		# 开启 退回模式
    	publisher-returns: true

33 具体代码如下:
    /**
     * @author Echo
     * 回退模式
     */
    @Test
    public void testReturn(){
        // 1、设置交换机处理失败消息的模式
        rabbitTemplate.setMandatory(true);
        // 2、设置ReturnCallBack
        /**
         * @author Echo
         * setReturnCallback(ReturnCallback)
         *      需要传入一个ReturnCallback对象
         * ReturnCallback:
         *      returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey)
         * 参数解释:
         *      message:消息对象
         *      replyCode:错误码
         *      replyText:错误信息
         *      exchange:交换机名称
         *      routingKey:路由键
         */
        rabbitTemplate.setReturnCallback((message,replyCode,replyText,exchange,routingKey) -> {
            System.out.println("return 执行了....");
            System.out.println(message);
            System.out.println(replyCode);
            System.out.println(replyText);
            System.out.println(exchange);
            System.out.println(routingKey);
        });
        // 正常情况
        rabbitTemplate.convertAndSend(RmConfig.EXCHANGE_NAME,"t1.topic.test","hello springboot topic");
        // 失败情况
        // rabbitTemplate.convertAndSend(RmConfig.EXCHANGE_NAME,"t2.topic.test","hello springboot topic");
    }

项目代码链接:https://github.com/Mbm7280/rabbitmq_demo

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值