我需要同步发送和接收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。但我需要对某些消息进行同步响应。
答案 0 :(得分:2)
你的问题不明确;如果你想要一个同步回复,那么使用sendAndReceive;调用线程将阻塞,直到收到回复。
不,你不能使用与听众相同的队列 - 他们将竞争消息。
如果您想要异步发送和接收,则replyToAddress
只能与sendAndReceive
操作一起使用。
如果要进行异步发送和接收,则必须在消息属性中设置replyTo
属性(队列名称或exchange/routingKey
) - 然后再调用send
或{ {1}}使用MessagePostProcessor
。
您需要配置一个侦听器容器来接收回复(您说过你有)。
即将到来的1.6 release有一个sendAndReceive
,其AsyncRabbitTemplate
方法返回sendAndReceive
;这是一种方便,可以包含ListenableFuture
和RabbitTemplate
的回复。
修改强>
您无法使用相同的回复队列进行同步和异步回复。
使用固定回复队列时,您需要configure a reply listener container as described in the documentation。
但是,您并不需要指定回复队列;如果代理支持,模板将使用Direct ReplyTo(否则将使用临时队列)。
如果必须使用命名的回复队列(例如,您需要HA或响应系统不使用replyTo属性),则必须配置回复侦听器(模板为侦听器)。