我是新手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
}
答案 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来控制线程