使用Rabbit-Template

时间:2019-04-23 21:37:38

标签: spring-boot spring-amqp

我有一个订户,该订户收集消息直到达到指定的限制,然后将收集的消息传递给处理器以执行某些操作。代码工作正常,问题在于订户正在等待,直到它收集指定的号码消息为止。如果消息较少,程序控制权将不会传递给处理器。

例如,假设我的块大小为100,并且如果我有100条消息或100条消息的倍数,则程序可以正常工作。但是,如果我的消息数小于100或150,则订阅者可以读取某些消息,但它们从未传递给处理器。有什么办法可以确定是使用Rabbit模板的Queue是空的,以便我可以检查条件并打破循环

@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 :(得分:0)

有两种方法可以实现这一目标。

  1. 添加一个@EventListener来监听ListenerContainerIdleEvent,这些idleEventInterval会在一段时间内未收到任何消息时发布;设置容器的@RabbitListener属性。事件的源是侦听器容器。它包含id的{​​{1}}。参见Detecting Idle Consumers

  2. 使用RabbitAdmin.getQueueProperties()