RabbitTemplate 未配置为 MessageListener

RabbitTemplate is not configured as MessageListener

我需要同步发送和接收确认,为此我正在使用 RabbitTemplate。

RabbitTemplate 有 queue 和 replyAddress 属性,但在尝试向我发送时出现此错误:

java.lang.IllegalStateException: RabbitTemplate is not configured as MessageListener - can not use a 'replyAddress': amq.gen-t1ESvGc4I8EfGJCjWjBxKw

如果我使用 Send 方法而不是 SendAndReceive,那么过程是正确的,但响应会异步到达我(我有一个 MessageListener),但这不是我所需要的。

是否有可能我不能对 RabbitTemplate 使用与 MessageListener 相同的响应队列?


再次感谢Gary,很抱歉,因为问题真的不清楚。

当我发送消息时,我的 MessageListener 工作正常,但对于某些消息,我需要同步回复。当我使用 sendAndReceive 方法时,出现异常:

java.lang.IllegalStateException:RabbitTemplate 未配置为 MessageListener - 无法使用 'replyAddress':amq.gen-t1ESvGc4I8EfGJCjWjBxKw

并且 RabbitTemplate 具有 属性 回复地址:amq.gen-t1ESvGc4I8EfGJCjWjBxKw

如果我使用发送方法,则响应异步到达 MessageListener。但是我需要对某些消息进行同步响应。

你的问题不清楚;如果您想要同步回复,请使用 sendAndReceive;调用线程将阻塞,直到收到回复。

不,您不能使用与侦听器相同的队列 - 它们会竞争消息。

如果要异步发送和接收,replyToAddress 只能与 sendAndReceive 操作一起使用。

如果你想做异步发送和接收,你必须在消息属性中设置replyTo 属性(队列名称或exchange/routingKey) - 在调用[=14之前=] 或在 MessagePostProcessor 中使用 sendAndReceive.

您需要配置一个侦听器容器来接收回复(您说您有)。

即将推出的 1.6 release 有一个 AsyncRabbitTemplatesendAndReceive 个方法 return 一个 ListenableFuture;包裹 RabbitTemplateSimpleMessageListenerContainer 以方便回复。

编辑

您不能对同步和异步回复使用相同的回复队列。

使用固定回复队列时,需要configure a reply listener container as described in the documentation

但是,您实际上并不需要指定回复队列;如果代理支持,模板将使用 Direct ReplyTo(否则使用临时队列)。

如果您必须使用命名的回复队列(例如,您需要 HA 或响应系统不使用 replyTo 属性),那么您必须配置一个回复侦听器(以模板作为侦听器) .