В настоящее время ваше приложение, вероятно, перебирает сообщения, пока не получит обратно код возврата, указывающий, что очередь пуста. Чтобы продолжать прослушивать новые данные, вам нужно сделать две вещи:
- Не выходите из цикла при возврате кода возврата для «пустой очереди». Обойдите и попробуйте еще один
Receive()
. Вы должны объединить это со следующей рекомендацией.
- Когда вы выполняете
Receive()
, используйте тайм-аут. Например, consumer.Receive(20000)
будет ожидать следующего сообщения в течение 20 секунд, прежде чем истечет время ожидания.
Если вы не включите таймаут, то приложение будет выдавать огромное количество неудовлетворенных GET-запросов в QMgr, которое будет казаться запущенным приложением и / или сбегающим QMgr, и вы увидите процессы с высокой загрузкой ЦП.
Вы можете спать между Receive()
звонками, но это не очень эффективно. Использование Receive(TIMEOUT)
блокирует поток только тогда, когда нет доступных сообщений. Как только приходит сообщение, его передача потоку не задерживается. Если вы вручную спите поток, он должен опросить очередь и будет делать это только с установленными интервалами sleep()
.
Альтернативой является то, что вы можете настроить метод обратного вызова, чтобы поток не блокировался. Например, если у вас есть метод обратного вызова OnNewMessageCallback
, вы можете создать прослушиватель асинхронных сообщений с помощью MessageListener messageListener = new MessageListener(OnNewMessageCallback);
Оба эти метода описаны в примерах. Если вы установили SDK и образцы, они будут ниже C:\Program Files (x86)\IBM\WebSphere MQ\tools\dotnet\samples
или эквивалентного, в зависимости от того, где вы установили WMQ.
Если вам интересно, как определить разницу между "нет сообщений в очереди" и более серьезной ошибкой, отметьте MQException.ReasonCode
. Если это 2033, то время ожидания истекло. Этот и все другие коды причин определены здесь .
Если у вас есть программа, которая будет успешно зацикливаться и ждать новых сообщений, вы можете либо запустить ее как службу, как описано в ответе Саймона, либо интерактивно, как вы делаете сейчас.
Если вы разрабатываете на WMQ v6, имейте в виду, что с сентября 2012 года v6 является окончанием обслуживания и что интеграция .Net на намного лучше в v7.0 или v7.1 WMQ. , Вы можете загрузить последнюю версию клиента WMQ v7.0 с классами .Net с SupportPac MQC7 . Соответствующий инфоцентр здесь . Клиент v7.1 будет SupportPac , когда он будет выпущен, но точное имя пока не известно. Я постараюсь не забыть обновить эту ссылку, когда она будет доступна. На сегодняшний день клиент v7.1 доступен через Passport Advantage с использованием вашей учетной записи клиента IBM. Инфоцентр v7.1 здесь .