我有一个订户,该订户收集消息直到达到指定的限制,然后将收集的消息传递给处理器以执行某些操作。代码工作正常,问题在于订户正在等待,直到它收集指定的号码消息为止。如果消息较少,程序控制权将不会传递给处理器。
例如,假设我的块大小为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..
}
答案 0 :(得分:0)
有两种方法可以实现这一目标。
添加一个@EventListener
来监听ListenerContainerIdleEvent
,这些idleEventInterval
会在一段时间内未收到任何消息时发布;设置容器的@RabbitListener
属性。事件的源是侦听器容器。它包含id
的{{1}}。参见Detecting Idle Consumers。
使用RabbitAdmin.getQueueProperties()
。