请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于自定义Adpter的手动签收问题

老师您好,我按照咱们的课程内容自己创建了一个代理类用来消费。
但是我这面有一个问题,在您的课程中是用的MessageListernerAdapter,在里面注入了我们自定义的代理类。那么您的Container中设置的签收模式是自动签收,那如果我要想做成手动签收的话,我这面改怎么处理呢。因为我看到Adapter的源码中 只有ChannelAwareMessageListener才将channel参数传递下去。但是从源代码看,适配器在这种情况下只会触发onMessage方法了这样的话我们的自定义消费方法就不适用了。有什么办法可以解决么?,下图是MessageLinstenerAdapter源码的代码段

图片描述

正在回答 回答被采纳积分+3

2回答

提问者 程序猿_郭文超 2020-04-14 16:53:09

已解决,记录一下。

依旧是根据MessageListenerAdapter里面的源码。根据其接受返回值的方式做到自定义方法手动签收的。

其源码中有队我们消费的特殊返回值类型(ListenableFuture)做了特殊处理。

https://img1.sycdn.imooc.com/szimg/5e957797098a9fcc12790697.jpg

从这里可以看spring提供的抽象适配器在我们返回的ListenableFuture增加了成功回调方法,如果我们异步操作成功后会为我们消费的消息做手工签收。那么这里在做手工签收之前,适配器还做了一些事情,就是它这面会需要将我们的结果转换为message,这里的message就是通过我们自定义的converter将实体对象转换为amqp的消息对象。然后将message根据发送消息提供的replayToAddress属性,将返回值返回给指定的队列中。

https://img1.sycdn.imooc.com/szimg/5e9578ed09cdf8cb11440392.jpg

所以综上,如果我们要按照老师讲的使用自定义方法的方式消费,我们需要在发送消息到borker中时,需要指定消息的replayToAdress属性。并且在消费的代理类中,我们需要通过异步的方式来消费我们的消息。

https://img1.sycdn.imooc.com//szimg/5e9579e909301a4912530317.jpg

https://img1.sycdn.imooc.com//szimg/5e9579e9096453b411370298.jpg





0 回复 有任何疑惑可以回复我~
阿神 2020-04-14 12:37:34

手工签收,必须要拿到deliavrytag,要这个东西必须通过channel,暂时没有更好的方式

0 回复 有任何疑惑可以回复我~
  • 提问者 程序猿_郭文超 #1
    我这面看了他们的源码 我们自定义的方法,要是返回一个返回值,MessageListenerAdpter会处理器我们返回值,只要我们的返回值是ListenableFuture,他会自动添加一个callBack 并会帮我们签收。这个位置能请老师讲一下么
    回复 有任何疑惑可以回复我~ 2020-04-14 14:15:36
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信