关于自定义Adpter的手动签收问题
来源:4-11 SpringAMQP消息转换器-MessageConverter讲解-2

程序猿_郭文超
2020-04-13
老师您好,我按照咱们的课程内容自己创建了一个代理类用来消费。
但是我这面有一个问题,在您的课程中是用的MessageListernerAdapter,在里面注入了我们自定义的代理类。那么您的Container中设置的签收模式是自动签收,那如果我要想做成手动签收的话,我这面改怎么处理呢。因为我看到Adapter的源码中 只有ChannelAwareMessageListener才将channel参数传递下去。但是从源代码看,适配器在这种情况下只会触发onMessage方法了这样的话我们的自定义消费方法就不适用了。有什么办法可以解决么?,下图是MessageLinstenerAdapter源码的代码段
2回答
-
程序猿_郭文超
提问者
2020-04-14
已解决,记录一下。
依旧是根据MessageListenerAdapter里面的源码。根据其接受返回值的方式做到自定义方法手动签收的。
其源码中有队我们消费的特殊返回值类型(ListenableFuture)做了特殊处理。
从这里可以看spring提供的抽象适配器在我们返回的ListenableFuture增加了成功回调方法,如果我们异步操作成功后会为我们消费的消息做手工签收。那么这里在做手工签收之前,适配器还做了一些事情,就是它这面会需要将我们的结果转换为message,这里的message就是通过我们自定义的converter将实体对象转换为amqp的消息对象。然后将message根据发送消息提供的replayToAddress属性,将返回值返回给指定的队列中。
所以综上,如果我们要按照老师讲的使用自定义方法的方式消费,我们需要在发送消息到borker中时,需要指定消息的replayToAdress属性。并且在消费的代理类中,我们需要通过异步的方式来消费我们的消息。
00 -
阿神
2020-04-14
手工签收,必须要拿到deliavrytag,要这个东西必须通过channel,暂时没有更好的方式
012020-04-14
相似问题