开始
消费端确认
解决消费异常处理的问题。
自动ack就是自动签收消息。
消费端签收就是消费端告诉RabbitMQ这个消息签收了。默认的情况下我们都是自动签收
我们调用代码显示的签收,如果我们不调用这行代码,显示的签收的话,在rabbitMQ那里就显示这条消息未被签收,如果这条消息一直未被签收,当我们的消费端重启了之后,这个消息会被从未签收状态转移成ready状态,这条消息就会重新的被其他消费者来消费。
我们需要手动的的消息ACK。也分为不同的类型。
随着消费者签收 ,我们还可以使用一个特性,叫做重回队列。当消费端不想接收这条消息的时候,把这条消息推回给队列。但是这条消息我处理异常异常了,退回队列,但是这个队列就我一个消费者,可能还是我消费。
实战
在商家服务里面
首先把自动Ack属性关闭,设置为false
在这里,对收到的消息进行签收
签收单条。
启动order微服务和商家的服务。
postman发送数据测试
商户微服务收到消息,但是抛异常了
我们在上一节的时候把这个channel的绑定给关闭了
这个channel是我们收到消息后,为了发新消息,临时起的一条channel
我们需要用哪个消息进行签收啊,需要用接收消息那条channel进行签收。
我们要用上面这条channel进行确认签收。不应该用下面的
我们看看这个方法里面有没有能收到。ctrl+鼠标组件,进入到message里面,看看有没有能收到channel的参数。
Delivery里面也没有。
这是我们传数据的时候的回调方法,我们进去basicConsume里面看看具体的
找到这个方法。好像也不行。
这个channel涉及进程间,线程间共享对象用。我们的需求就是线程间能不能共享对象。
这个是个单例,我们可以给他一个类变量。这个类变量是全局的 ,这样我们每个进程都可以用它。
我们怎么把监听的时候把Channel给保存住。监听的时候的channel赋值给类变量。
回调里面就不用再新建channel
前面的factory也删掉
这里就自动用的是当前类的变量了
点击上面的channel,ctrl+鼠标左键就跳转到了这里
这个时候按说我们就可以用basicAck了。
启动服务测试。看下一节