如何设置超时到RabbitMQ DefaultConsumer?

时间:2017-02-02 09:18:38

标签: java rabbitmq

我有一个应用程序,作为rabbitmq生产者。我已经应用了RPC方法,没有问题。生产者发布消息并在replyQueues(临时队列)中使用其响应。首先,我使用QueueingConsumer进行生产者消费,我曾经将超时设置为nextDelivery(timeout)方法。 QueueingConsumer现已弃用,在RabbitMQ官方网站上,他们更改了他们的RPC教程,他们使用了DefaultConsumer而不是QueueingConsumer。我也用DefaultConsumer替换了QueueingConsumer。但是现在有一个问题:如何设置DefaultConsumer的超时?因为如果消费者没有发送任何响应,则垃圾临时队列仍保留在代理中。新旧生产者消费部分如下。谢谢你的帮助。

旧生产者消费方法:

    consumer = new QueueingConsumer(channel);
    channel.basicConsume(replyQueueName, true, consumer);
    channel.basicPublish("", requestQueueName, props, message.getBytes("UTF-8"));

        while (true) {
            QueueingConsumer.Delivery deliver = consumer.nextDelivery(timeout);
            if (deliver.getProperties().getCorrelationId().equals(corrId)) {
                response = new String(deliver.getBody(), "UTF-8");
                break;
            }
        }

        return response;

新的生产者消费方法:

      final BlockingQueue<String> response = new ArrayBlockingQueue<String>(1);

    Consumer consumer = new DefaultConsumer(channel) {
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
            if (properties.getCorrelationId().equals(corrId)) {
                response.offer(new String(body, "UTF-8"));
            }
        }
    };

    channel.basicConsume(replyQueueName, true, consumer);

    return response.take();

1 个答案:

答案 0 :(得分:1)

它解决了。超时可以设置为“响应”对象。 “新生产者消费方法”的变化可以如下:

响应超时:必须使用$sql = "UPDATE user_passwords SET status ='off' WHERE users_id = '$user_id'"; 代替response.poll(5000, TimeUnit.MILLISECONDS)