我正在使用spring amqp接收来自Rabbitmq的消息。 我一次只消耗一条消息,并且它很慢,因为我将其保存到数据库。因此每次都要打开和关闭交易。
现在我已经建立了这样的消费者。
@RabbitListener(queues = "queuename")
public void receive(Message message) {
someservice.saveToDb(message);
}
但这真的很慢。在开始保存之前,我想消耗一堆消息。然后,我可以进行交易。保存300,然后提交并加载下一批。
这样的作品行吗?
class MessageChannelTag {
Message message;
Channel channel;
long tag;
}
@Component
class ConsumerClass {
List<MessageChannelTag> messagesToSave = new ArrayList<>();
@RabbitListener(queues = "queuename")
public void receive(Message message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag)
throws IOException {
messagesToSave.add(new MessageChannelTag(message, channel, tag));
}
@Scheduled(fixedDelay=500)
public void saveMessagesToDb() {
List saveTheese = new ArrayList(messagesToSave);
messagesToSave.clear();
service.saveMessages(saveTheese);
for(MessageChannelTag messageChannelTag:messagesToSave) {
//In the service I could mark the rows if save succeded or not and
//then out here I could ack or nack..
messageChannelTag.getChannel().basicAck(messageChannelTag.getTag(), false);
}
}
}
如果有更简单的解决方案,请告诉我。我更喜欢快速,简单且强大的=)
答案 0 :(得分:1)
“上游”生产者是否可以提供批量消息而不是单个消息,这也可能值得调查。
答案 1 :(得分:0)
不要使用“拉” API(basic.get
),它的效率不及使用消息。
将预取(也称为QoS)设置为300,然后在完成后立即确认消息。我不熟悉Spring,但可以肯定有装饰器或其他方法可以完成此操作。
所有内容都包含在文档和教程中-https://www.rabbitmq.com/consumer-prefetch.html
注意: RabbitMQ团队监视rabbitmq-users
mailing list,并且有时仅在StackOverflow上回答问题。