RabbitTemplate未配置为MessageListener

时间:2016-03-02 12:39:25

标签: spring-amqp

我需要同步发送和接收ack,为此我使用的是RabbitTemplate。

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

  

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

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

我是否可能无法为RabbitLmplate使用与MessageListener相同的响应队列?

再次感谢加里,对不起,因为问题真的不明确。

当我发送消息时,我有一个MessageListener正常工作,但对于某些消息,我需要一个同步回复。当我使用sendAndReceive方法时,我得到了异常:

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

RabbitTemplate的属性为replyAddress:amq.gen-t1ESvGc4I8EfGJCjWjBxKw

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

1 个答案:

答案 0 :(得分:2)

你的问题不明确;如果你想要一个同步回复,那么使用sendAndReceive;调用线程将阻塞,直到收到回复。

不,你不能使用与听众相同的队列 - 他们将竞争消息。

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

如果要进行异步发送和接收,则必须在消息属性中设置replyTo属性(队列名称或exchange/routingKey) - 然后再调用send或{ {1}}使用MessagePostProcessor

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

即将到来的1.6 release有一个sendAndReceive,其AsyncRabbitTemplate方法返回sendAndReceive;这是一种方便,可以包含ListenableFutureRabbitTemplate的回复。

修改

您无法使用相同的回复队列进行同步和异步回复。

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

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

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