【问题标题】:RabbitTemplate is not configured as MessageListenerRabbitTemplate 未配置为 MessageListener
【发布时间】:2016-03-02 12:39:24
【问题描述】:

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

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

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

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

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


再次感谢 Gary,很抱歉,这个问题确实不清楚。

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

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

并且 RabbitTemplate 具有属性 replyAddress : amq.gen-t1ESvGc4I8EfGJCjWjBxKw

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

【问题讨论】:

    标签: spring-amqp


    【解决方案1】:

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

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

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

    如果您想进行异步发送和接收,您必须在消息属性中设置replyTo 属性(队列名称或exchange/routingKey) - 在使用@987654330 时调用sendMessagePostProcessor 之前@。

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

    即将到来的1.6 release 有一个AsyncRabbitTemplate,它有一个sendAndReceive 方法,返回一个ListenableFuture;这是一个方便的包装 RabbitTemplateSimpleMessageListenerContainer 的回复。

    编辑

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

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

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

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

    【讨论】:

    • 我在问题中添加了更多信息。异步回复工作正常,问题是我何时期望同步回复。
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    相关资源
    最近更新 更多