开始

我们不止有发送的需求。confirm的需求,消息返回的需求。
image.png
首先是设置Mandatory的选项。消息返回必须要把Mandatory打开。以前是把channel的mandatory打开。现在就是把这里的rabbitTemplate的mandatory打开。
image.png
设置return CallBack 就是消息返回时的回调方法。
image.png
里面要传一个ReturnCallBack类。
image.png
这个类也是函数式的接口
image.png
函数式接口可以用莱姆达表达式,也可以直接new 这个函数式接口

image.png
image.png

image.png

这里提示你,alt+enter的话,可以变成莱姆达表达式
image.png
因为函数式接口只有一个方法,可以写成莱姆达表达式
image.png
我们直接在这里打log
image.png

confirm确认

image.png
也是打log
image.png
变成莱姆达形式
image.png
image.png

启动测试

发消息
image.png

image.png

发送了,但是没有回调我们的方法
image.png

如果遇到类似的问题,去网上搜索资料 大多数会要求你 。需要加第一行和第三行的配置。
image.png
但是你加上了上面的两行配置后也有问题。下面的红线表示在spring boot 2.2之后,这个参数已经被弃用了 所以网上说的都不对。
image.png
网上说的为什么不对呢?因为这里的ConnectionFactory是我们自己定义的。并不是spring boot帮我们生成的。
image.png
那么我们怎么排查问题呢?去RabbitTemplate里面去找刚才我们设置的成员。它设置进去了 它已经变成这个类的成员了。它早晚会被调用。它在什么情况下被调用呢?
image.png
点右键有一个 Find Usages。
image.png
或者是Alt+F7都可以。
image.png
放大看一下,它在这里类里面这些地方都被调用了。
image.png
根据名字判断,感觉这个有用。
image.png
双击一下这个地方
image.png

image.png
setConfirm的alt+F7
image.png

image.png
找到这个方法。。好像也没有找到什么有用的。
image.png
这个变量我们以前没有设置过。
image.png
alt+F7
image.png
找这个
image.png
看着connectionFactory看着和publishConfirm有关
image.png

image.png
它会判断这个connectionFactory有没有开发送者确认。
image.png

回到我们的配置类,看看有没有类似setPublishConfirm的方法。但是很可惜这个方法被弃用了。
image.png
点进来发现它被弃用了,但是被替换成了setPubliserConfirmType
image.png
我们点进来看一下
image.png

image.png
需要一个参数是一个枚举类
image.png
我们先用Simple试一下
image.png
它还有return的操作
image.png
也就是发送确认还必须开启这两个属性
image.png

重启服务测试

order服务。
image.png

管控台看到收到1条消息
image.png
收到了log
image.png
就是它调用了消息的确认
image.png
发送者确认我们是打开了 但是功能有个很大的问题。首先它是异步的。发送者确认之前我们讲过有异步也有同步的。异步的问题是我们根本不知道它在确认的是哪一条消息。之前还有个序号,这里连序号都没有了。 只返回一个ack为true。casue为null,表示确认了已经, 没有原因。
image.png
我们关注到correlationData这个参数上。correlation在英文里面是对应和对照的意思。也就是说我们可以用一些对照关系来做它的回调时候的消息,和我们发送消息的对应。回调的时候是在一个异步的线程里面。
image.png
他和以前的线程不一样。她不知道确认的消息是哪一条消息。
image.png
这里的类型我们要改成相关的。
image.png

再没换到消息发送的地方,发送的时候多塞一个值。就是消息相关对应的一个操作。
image.png
我们就拿订单的id当做是id
image.png

调用方法的重载,传递给消息。发送的时候带着对应关系。
image.png

重启再次测试

image.png

消息回调 带着消息的id
image.png

结束