1 ответ:
Как и все хорошие вопросы, " это зависит."
Очередь может быть очищена командой только в том случае, если в ней нет открытых дескрипторов. В этом случае отправка команды PCF для очистки очереди довольно эффективна,но если есть открытые дескрипторы, вы получите ошибку. Команды PCF, конечно, являются функцией Java, а не JMS, поскольку они являются собственностью WebSphere MQ.
С другой стороны, любая программа, уполномоченная выполнять деструктивные выходы из очереди, может очистить очередь. В этом кейс, просто повторите цикл над get, пока не получите код возврата 2033, указывающий, что очередь пуста. Это может быть выполнено с помощью JMS или Java, но оба они управляют входным буфером для вас. Если очередь действительно глубокая, то вы в конечном итоге перемещаете все эти данные, и если приложение подключено к клиенту, вы перемещаете его со скоростью сети, а не в памяти.
Чтобы обойти это, вам нужно указать минимальное количество буфера и в качестве одного из вариантов GET также указать
MQGMO.TRUNCATED_MSG_ACCEPTED. Это перемещает только сообщение заголовок во время получения вызовов и может быть значительно быстрее.Наконец, если вы делаете это программно и независимо от того, какой метод вы используете, выделите несколько потоков и не используйте syncpoint. На самом деле вам нужно из кожи вон лезть, чтобы получить эксклюзивный ввод в очередь, поэтому, как только вы получите сеанс, просто породите из него много потоков. Закройте каждый поток изящно и завершите сеанс, как только все потоки будут закрыты.
Comments