当队列被铲除时,convertSendAndReceive不起作用

时间:2015-07-27 11:29:02

标签: rabbitmq spring-amqp

仅供参考,我是RabbitMQ的新手。

对于我尝试使用RabbitMQ的应用程序,我有这个用例:

  • 生产者向队列发送一些消息
  • 消费者流程并发送回复
  • 根据回复生产者的行为

对于上面的场景,我使用了convertSendAndReceive,当生产者和消费者都在同一个RabbitMQ服务器中时,它就像魅力一样。但是当队列被Shoveled时,同样的方法不起作用。

如果我使用了错误的方法/配置,请告诉我w.r.t RabbitMQ。

提前致谢。

添加代码

消费

public static void main(String[] args) throws InterruptedException {
       ConnectionFactory cf = new CachingConnectionFactory("10.223.19.89");        

        // set up the queue, exchange, binding on the broker
        RabbitAdmin admin = new RabbitAdmin(cf);
        Queue queue = new Queue("myQueue");
        Queue queueReply = new Queue("myQueue_reply");

        admin.declareQueue(queue);
        admin.declareQueue(queueReply);
        TopicExchange exchange = new TopicExchange("myExchange");

        admin.declareExchange(exchange);
        admin.declareBinding(
            BindingBuilder.bind(queue).to(exchange).with("foo.*"));
        admin.declareBinding(
                BindingBuilder.bind(queueReply).to(exchange).with("foo.*"));

        SimpleMessageListenerContainer container =
                new SimpleMessageListenerContainer(cf);
        Object listener = new Object() {
            public String handleMessage(String foo) {            
                return foo + "test";
            }
        };

        MessageListenerAdapter adapter = new MessageListenerAdapter(listener);

        container.setMessageListener(adapter);          
        container.setQueueNames("myQueue");         
        container.start();

}

生产者

public void run()
{  

    Thread t = Thread.currentThread();
    ConnectionFactory cf = new CachingConnectionFactory("10.223.19.93");

    RabbitTemplate template = new RabbitTemplate(cf);
    template.setExchange("myExchange");
    template.setRoutingKey("foo.bar");
    Queue queueReply = new Queue("myQueue_reply");
    template.setReplyQueue(queueReply);     

    Object test = template.convertSendAndReceive("Hello world");
    System.out.println(test.toString());

}

public static void main(String[] args) throws InterruptedException {
    for(int i=0; i< 5; i++)
    {
        Thread t = new Thread(new SendReceiveThread());
        t.setName("Thread # " + i);
        t.start();      
        Thread.sleep(100);
    }

}

1 个答案:

答案 0 :(得分:1)

最好的猜测是你需要使用named reply queue并铲除它。

此方案需要<reply-listener/>

在rabbitmq 3.4之前,临时队列用于回复;直接回复与3.4及以上版本一起使用,但我的猜测是,兔子没有铲除为此创建的伪队列。

修改

使用固定回复队列并以编程方式创建兔子模板时,必须连接侦听器容器并将模板设置为侦听器。请参阅the documentation

  

如果您将RabbitTemplate定义为<bean/>,或使用@Configuration类将其定义为@Bean或以编程方式创建模板,您需要自己定义并连接回复侦听器容器。如果您没有这样做,模板将永远不会收到回复,并最终会超时并返回null作为对sendAndReceive方法调用的回复。