Есть ли способ найти очередь пустой с помощью rabbit-шаблона? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть подписчик, который собирает сообщения, пока не достигнет указанного предела, а затем передает собранные сообщения процессору для выполнения некоторых операций.Код работает нормально, проблема в том, что абонент ждет, пока не соберет указанное количество сообщений.Если у нас меньше сообщений, управление программой не будет передано процессору.

Например, допустим, мой размер чанка равен 100, а если у меня 100 или несколько из 100 сообщений, программа работает нормально. Но если у меня есть сообщения <100 или150 некоторые сообщения читаются подписчиком, но они никогда не передаются процессору.Есть ли способ выяснить, что очередь пуста, используя шаблон кролика, чтобы я мог проверить это условие и разорвать цикл </p>

@RabbitListener(id="messageListener",queues = "#{rabbitMqConfig.getSubscriberQueueName()}",containerFactory="queueListenerContainer")
    public void receiveMessage(Message message, Channel channel, @Header("id") String messageId, 
            @Header("amqp_deliveryTag") Long deliveryTag) {

        LOGGER.info(" Message:"+ message.toString());
        if(messageList.size() < appConfig.getSubscriberChunkSize() ) {
            messageList.add(message);
            deliveryTagList.add(deliveryTag);
            if(messageList.size() == appConfig.getSubscriberChunkSize()) {
                LOGGER.info("------------- Calling Message processor --------------");
                Message [] messageArry = new Message[messageList.size()];
                messageArry =  messageList.toArray(messageArry);
                LOGGER.info("message Array Length: "+messageArry.length);
                messageProcessor.process(messageArry);
                messageList = new ArrayList<Message>(Arrays.asList(messageArry));
                LOGGER.info("message Array to List conversion Size: "+messageList.size());
                LOGGER.info("-------------- Completed Message processor -----------");
                eppQ2Publisher.sendMessages(messageList, channel, deliveryTagList);
                messageList.clear();
                deliveryTagList.clear();
            }

        } else {
            // do nothing.. 

        }

1 Ответ

0 голосов
/ 24 апреля 2019

Для этого есть два способа:

  1. Добавить @EventListener для прослушивания ListenerContainerIdleEvent с, которые публикуются, если в течение некоторого времени не было получено ни одного сообщения;установить свойство контейнера idleEventInterval.Источником события является контейнер слушателя;он содержит @RabbitListener * id.См. Обнаружение незанятых потребителей .

  2. Использование RabbitAdmin.getQueueProperties().

...