【发布时间】:2020-06-19 00:45:35
【问题描述】:
在使用 artemis 的 Spring Boot 应用程序中,我们尽量避免包含太多消息的队列。目的是仅在当前队列中的消息数量低于某个限制时才放入新消息,例如100 条消息。但是,这似乎不起作用,但我们不知道实现该功能的原因或“正确”方法是什么。尽管在 gui 中有消息,但下面代码提取的消息数始终为 0。
为了重现问题,我在本地安装了 apache-artemis-2.13.0。
我们正在做类似以下的事情
if (!jmsUtil.queueHasNotMoreElementsThan(QUEUE_ALMOST_EMPTY_MAX_AMOUNT, reprocessingMessagingProvider.getJmsTemplate())) {
log.info("Queue has too many messages. Will not send more...");
return;
}
jmsUtil 的实现方式类似于
public boolean queueHasNotMoreElementsThan(int max, JmsOperations jmsTemplate) {
return Boolean.TRUE.equals(
jmsTemplate.browse((session, queueBrowser) -> {
Enumeration enumeration = queueBrowser.getEnumeration();
return notMoreElemsThan(enumeration, max);
}));
}
private Boolean notMoreElemsThan(Enumeration enumeration, int max) {
for (int i = 0; i <= max; i++) {
if (!enumeration.hasMoreElements()) {
return true;
}
enumeration.nextElement();
}
return false;
}
作为检查,我还使用以下方法直接给我队列中的消息数。
public int countPendingMessages(String destination, JmsOperations jmsTemplate) {
Integer totalPendingMessages = jmsTemplate.browse(destination,
(session, browser) -> Collections.list(browser.getEnumeration()).size());
int messageCount = totalPendingMessages == null ? 0 : totalPendingMessages;
log.info("Queue {} message count: {}", destination, messageCount);
return messageCount;
}
提取队列大小的方法似乎也被其他人使用,并且基于QueueBrowser的文档:The getEnumeration method returns a java.util.Enumeration that is used to scan the queue's messages.
以上是如何获取队列大小的正确方法吗?如果是这样,问题的原因可能是什么?如果不是,应该如何查询队列大小? spring 是否提供任何其他访问队列的可能性?
更新:我阅读了another post 和documentation,但我不知道如何获取ClientSession。
【问题讨论】:
标签: spring-boot activemq-artemis