ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-01 17:57:59  阅读:179  来源: 互联网

标签:rabbitTemplate 03 进阶 exchange System RabbitMq topic println out


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

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

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

2、3 使用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");
    }

2、4 
	运行测试。
3、1 退回模式:

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

3、3 具体代码如下:
    /**
     * @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

标签:rabbitTemplate,03,进阶,exchange,System,RabbitMq,topic,println,out
来源: https://blog.csdn.net/weixin_45438044/article/details/122269256

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有