有适当的方法可以保证RabbitMQ订阅中消息的顺序。
如果您使用多个消费者,它们将使用共享的ExecutorService
处理消息。另请参见ConnectionFactory.setSharedExecutor(...)
。您可以设置一个Executors.newSingleThreadExecutor()
。
如果您使用一个Consumer
和一个队列,您可以使用多个bindingKeys(它们可能带有通配符)绑定此队列。消息将按照它们被消息代理接收到的顺序放入队列中。
例如,您有一个单一的发布者发布消息,其中顺序很重要:
try (Connection connection2 = factory.newConnection();
Channel channel2 = connection.createChannel()) {
for (int i = 0; i < messageCount; i++) {
final String routingKey = i % 2 == 0 ? routingEven : routingOdd;
channel2.basicPublish(exchange, routingKey, null, ("Hello" + i).getBytes(UTF_8));
}
}
你现在可能希望从同一个队列中按照发布顺序接收来自两个主题的消息:
final String queueName = channel.queueDeclare().getQueue();
final String routingEven = "even";
final String routingOdd = "odd";
channel.queueBind(queueName, exchange, routingEven);
channel.queueBind(queueName, exchange, routingOdd);
channel.basicConsume(queueName, true, new DefaultConsumer(channel) { ... });
Consumer
现在将按照发布的顺序接收消息,无论您使用了不同的
topics。
RabbitMQ文档中有一些很好的5分钟教程,可能会有所帮助:
https://www.rabbitmq.com/tutorials/tutorial-five-java.html
redelivered
将是false
而不是像正常重新排队一样的true
。 - Kien Nguyen