2014-02-14 1 views
0

У меня возникла ситуация, когда мне нужно слить 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?

ответ

3

В TIBCO EMS Администратор вы можете просто выполнить команду

PURGE QUEUE <queue name> 

, чтобы удалить все сообщения из него. Для нескольких очередей, вы можете сделать

PURGE ALL QUEUES <pattern using '>' and '*' as wildcards> 

Обратите внимание, что интерфейс командной строки СЭМ администратора в стороне, есть также Java-API выдавать такие команды администратора непосредственно внутри программы Java.

0

Вы можете установить истечение срока действия сообщения, если сообщение не требуется по истечении определенного периода времени. Это гарантирует, что сообщение истечет после истечения срока действия. В дополнение к истечению срока действия можно использовать простой вызов receive() с таймаутом. Прием будет работать, если в очереди есть сообщения. Если сообщение находится в состоянии без привязки или заблокировано каким-либо процессом, только тогда приемный вызов не сможет получить это сообщение.

Смежные вопросы