我可以在@RabbitConsumer中查找是否为此消费者预取了任何消息吗

时间:2019-05-27 19:14:17

标签: spring-amqp

我需要知道此消费者是否还有更多消息。

现在,我对队列中的消息进行计数。但这只给了我队列中剩下的,而不是预取的。

@RabbitListener(queues = QUEUENAME)
    public void recieve(Message message, Channel channel) throws IOException {
   long messagesOnQueue = channel.messageCount(QUEUENAME);
   if(messagesOnQueue>1) {
     //add message to list
   }
   else {
      //save the list
   }
}

如果有一种方法可以确定是否已为此用户预取消息,那将非常好。那可能吗?如果我可以得到该计数,那么我也不在乎队列中是否还有消息。

在收到Gary的建议后,我将实现更改为此实现,并且它可以正常工作。 手动确认消息时,必须在收到消息的同一通道上完成。但是,如果在另一个线程中需要它,则可以保存对它的引用。 在您的spring boot application.yml中添加此

spring:
  rabbitmq:
    listener:
      direct:
        prefetch: 200
      simple:
        prefetch: 200
        acknowledgeMode: MANUAL

来自消费者的代码。

//The list we build and save in one transaction
    private Set<PayloadDto> unhandledPayloads = new HashSet<>();
    private long latestTag = 0L;
    private Channel latestChannel;

    @RabbitListener(queues = QUEUE_NAME, id = "consumerId")
    public void recieve(Message message, Channel channel) throws IOException {
        PayloadDto payloadDto = parse(message.getBody());

        unhandledPayloads.add(payloadDto);
        latestTag = message.getMessageProperties().getDeliveryTag();
        latestChannel = channel;
        if (unhandledPayloads.size() > UNHANDLED_PAYLOADS_LIMIT) {
            service.createOrUpdate(unhandledPayloads);
            queue.clear();
            channel.basicAck(latestTag, true);
        }
    }


    @EventListener(condition = "event.listenerId == 'consumerId'")
    public void onApplicationEvent(ListenerContainerIdleEvent event) {
        if(!queue.isEmpty()) {
            service.createOrUpdate(unhandledPayloads);
            queue.clear();
            latestChannel.basicAck(latestTag, true);
        }

    }

我们要在保存列表之前先建立列表的原因是为了能够批量插入,以使其运行更快。

1 个答案:

答案 0 :(得分:1)

目前不是,但是添加功能并不困难。打开一个github问题来请求它。但是,我不确定它是否有用。如果队列中仍然有消息,则使用预提取的消息将提取另一个消息。