У меня возникла ситуация, когда мне нужно слить JMS (в частности, Tibco EMS). Вариант использования заключается в том, что если мы должны были провести большой перерыв, очередь будет нарастать и обрабатывать, это займет слишком много времени. Скорее, мы хотим слить очередь и выполнить процедуру типа холодного запуска, чтобы получить текущее состояние.Как правильно слить очередь с быстрым производителем?
код я до сих пор сделать это следующим образом:
int count = 0;
Message msg = null;
while ((msg = connection.receive(timeout)) != null) {
count++;
}
System.out.println(count + " msgs removed from queue: " + queueName);
В основном это петли прием сообщений до тех пор, пока не истечет timeout
, прежде чем сообщение получено, что указывает очередь пуста.
Мой вопрос касается этой величины timeout
. Предположим, у нас очень быстрый продюсер в очереди, установка тайм-аута, скажем, 500 мс, кажется немного произвольным. Возможно, что мы будем работать бесконечно (т. Е. Производитель производит> = 1 сообщение каждые 500 мс)
Альтернативой является использование receiveNoWait(). Это, на мой взгляд, вытаскивает сообщение, если оно доступно, или возвращает значение null, при этом не требуется тайм-аут. Однако, по словам THIS статье:
Не все JMS-провайдеры немедленно вернуться с сообщением, если вы звоните receiveNoWait() и могут быть сообщения на брокера, поэтому его стоит ждать второго или так просто быть убедитесь, что очередь действительно разряжена.
Так есть ли более надежный способ сделать это с помощью программного подхода? Альтернативно, есть функция стока, которая поставляется с администратором Tibco EMS?