В приложении с весенней загрузкой, использующем artemis, мы стараемся избегать очередей, содержащих слишком много сообщений. Намерение состоит в том, чтобы помещать новые сообщения только в том случае, если количество сообщений, находящихся в настоящее время в очереди, падает ниже определенного предела, например 100 сообщений. Однако это, похоже, не работает, но мы не знаем, почему и какой «правильный» метод будет для реализации этой функции. Количество сообщений, извлеченных приведенным ниже кодом, всегда равно 0, хотя в gui есть сообщения.
Чтобы воспроизвести проблему, я установил 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 какие-либо другие возможности доступа к очереди?
Обновление : я прочитал другой пост и документацию , но я не знаю о том, как получить ClientSession.