如何在没有确认的情况下消耗100条消息,然后进行工作然后确认它们?

时间:2019-05-03 21:04:30

标签: java spring rabbitmq amqp spring-amqp

我正在使用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);
    }
 }
}

如果有更简单的解决方案,请告诉我。我更喜欢快速,简单且强大的=)

2 个答案:

答案 0 :(得分:1)

“上游”生产者是否可以提供批量消息而不是单个消息,这也可能值得调查。

答案 1 :(得分:0)

不要使用“拉” API(basic.get),它的效率不及使用消息。

将预取(也称为QoS)设置为300,然后在完成后立即确认消息。我不熟悉Spring,但可以肯定有装饰器或其他方法可以完成此操作。

所有内容都包含在文档和教程中-https://www.rabbitmq.com/consumer-prefetch.html


注意: RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。