rinetd Promise django ClickHouse WorldCloud Java Spring 云计算架构 xaml installation encoding terminal msbuild jquery删除子元素 sublime分屏快捷键 matlab复数求模 matlab图像滤波 python数据格式 python的range python的extend java教学 java语言学习 java中的正则表达式 java继承关键字 java字符串查找 java怎么连接数据库 java入门课程 java获取本机ip java八大基本数据类型 谷歌地球打不开 咪咕客户端下载 js延迟加载的方式 js轮播图代码 php取整函数 黑市商人 虚拟打印机安装 上传附件 华为手机刷公交卡 unity3d中文版 驱动精灵绿色版 保卫萝卜沙漠7攻略
当前位置: 首页 > 学习教程  > 编程语言

spring-rabbitmq Publisher Confirms Return模式

2020/11/4 14:56:01 文章标签:

前言 在使用rabbitmq时有时我们需要保证消息有没有成功传递,消息有没有正常到达broker,消息有没有由exchange分配到队列。 一、Publisher-Confirm Publisher-Confirm是我们验证消息有没有顺利到达rabbit的broker,而之后消息有没有通过exch…

前言

在使用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


本文链接: http://www.dtmao.cc/news_show_350281.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?