一个队列上的多个Consumer RabbitMQ - Java

时间:2017-10-29 15:31:34

标签: java rabbitmq

我是新手RabbitMQ java客户端。 我的问题:我创建了10个使用者并将它们添加到队列中。每个消费者使用10秒钟来处理我的过程。我检查了兔子的页面,我看到我的队列有4000条消息没有发送给客户端。我检查了日志客户端,结果是为一个消费者收到一条消息,10秒后我收到一个消息给一个消费者等等。我想在当时为所有消费者收到10条消息(10条消息 - 当时10个消费者进程) 请帮助我,我没有找到问题的解决方案。 非常感谢。

        while (!isRetry) {
        try {
            isRetry = true;
            connection = mConnectionFactory.newConnection(addresses.toArray(new Address[addresses.size()]));
            String queueName = "webhook_customer";
            String exchangeName = "webhook_exchange";
            String routingKey = "customer";
            System.out.println("step2");

            Channel channel = connection.createChannel();
            channel.exchangeDeclare(exchangeName, "topic", true);
            channel.queueDeclare(queueName, true, false, false, null);
            channel.queueBind(queueName, exchangeName, routingKey);
            channel.basicQos(1);
            for (int i = 0; i < numberWorker; i++) {
                Consumer consumer = new QueueingConsumer(channel) {
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope,
                                               AMQP.BasicProperties properties, byte[] body) throws IOException {
                        long startProcess = System.nanoTime();
                        JSONObject profile = null;
                        try {

                        } catch (IOException ioe) {
                            handleLogError(profile, ioe.getMessage().toString());
                        } catch (Exception e) {
                            handleLogError(profile, e.getMessage());
                        } finally {
                            channel.basicAck(envelope.getDeliveryTag(), false);
                            long endProcess = System.nanoTime();
                            _logger.info("===========######### TIME PROCESS  + " + (endProcess - startProcess) + " Nano Seconds  ========#### " + (endProcess - startProcess) / 1000000 + " Milli Seconds");
                        }
                    }
                };

                channel.basicConsume(queueName, false, consumer);
            }
            System.out.printf("Start Listening message ...");
        } catch (Exception e) {
            System.out.println("exception " + e.getMessage());
            isRetry = closeConnection(connection);
            e.printStackTrace();
        } finally {
        }
        if (!isRetry) {
            try {
                System.out.println("sleep waiting retry ...");
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //END
    }

2 个答案:

答案 0 :(得分:0)

从您的代码示例中,您似乎可以使用QueueingConsumer代替DefaultConsumer。这将从RabbitMQ向消费者提取更多消息,并将它们排队,直到它们被处理完毕。

然后,在您的for (int i = 0; i < 10; i++)循环中,您使用相同的消费者实例消耗了10次。您应该创建10个消费者:

for (int i = 0; i < 10; i++) {
    Consumer consumer = new DefaultConsumer(channel) {
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
          channel.basicAck(envelope.getDeliveryTag(),false);
        }
    };

    channel.basicConsume(queueName, false, consumer);
}

理想情况下,创建另一个类并在循环中正确创建新实例而不是匿名实例。

注意:您的消费者应该在后台执行他们的流程(单独的线程),否则他们会相互阻止。虽然,您提供的信息并未真正显示您将如何实际处理消息。

答案 1 :(得分:0)

我确实在我的案例中找到了解决方案。当消息进来时我在消费者中使用新线程并且我在其中处理。我创建了多个频道,以便在当时发送多条消息。我使用threadpool来控制线程