Как заставить приложение MQ exe работать непрерывно? - PullRequest
2 голосов
/ 22 ноября 2011

Я написал приложение MQ, которое является exe, но оно работает только для одного экземпляра и завершает себя.Желаемая функциональность заключается в том, чтобы он работал непрерывно и продолжал обрабатывать данные, а после исчерпания данных он должен продолжать прослушивать новые данные.

Может кто-нибудь предложить мне, что нужно сделать?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 22 ноября 2011

В настоящее время ваше приложение, вероятно, перебирает сообщения, пока не получит обратно код возврата, указывающий, что очередь пуста. Чтобы продолжать прослушивать новые данные, вам нужно сделать две вещи:

  1. Не выходите из цикла при возврате кода возврата для «пустой очереди». Обойдите и попробуйте еще один Receive(). Вы должны объединить это со следующей рекомендацией.
  2. Когда вы выполняете 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 здесь .

1 голос
/ 22 ноября 2011

Если вы используете интерфейс .NET, посмотрите также на IBM Message Service Client для .NET a.k.a XMS .NET XMS .NET предоставляет JMS-подобный API, но на языке .NET. У него есть прослушиватель сообщений, через который сообщения могут приниматься асинхронно.

XMS устанавливается как часть MQ v7 Client SupportPac MQC7.

1 голос
/ 22 ноября 2011

Я предлагаю вам преобразовать свой код в службу Windows. Смотрите здесь для начала .NET: Введение в приложения-службы Windows

...