2017-02-02 37 views
0

Думаю, я описал почти все, что мне нужно в заголовке. Таким образом, есть некоторые потоки WMB. И один ждет ответа в очереди. Мне нужно исключить исключение, если после таймаута в очереди не будет сообщения.Как справиться с ситуацией, если сообщение не поступит в очередь после таймаута. Возможно ли это с Message Broker?

Спасибо за ваше время

ответ

1

Да это possibe, но вам нужно будет развивать его в своих потоках. MQ создается для асинхронной связи, поэтому тайм-аут не является чем-то, что является родным для него. Я могу думать о 2 возможных решений в настоящее время:

  • Используйте TimeoutControl и TimeoutNotification узлы в ваших потоках

В потоке, который посылает запрос, после отправки запроса вы добавляете узел TimeoutControl и настроить желаемый тайм-аут. Создайте новый поток, который начинается с потока TimeoutNotification. В этом потоке вы отправляете свою ошибку таймаута, если ответ еще не получен. И чтобы узнать, какой ответ получен, вы можете использовать разные методы, например потоки, отправляющие запрос и получающие ответ, могут поддерживать таблицу базы данных, или вы также можете сохранить эту информацию в очереди.

  • Start ожидания ответа после отправки запроса

Настройка потока ответа обработчика, чтобы начать с MQ Input сопровождаемого MQ Получить узел. Вы слушаете ответ с помощью MQ Get, на котором вы можете установить интервал ожидания, который будет вашим порогом таймаута. Вход MQ получает технические сообщения, отправленные потоком отправителя запроса после отправки запроса. Это хуже, чем первое, поскольку вы будете блокировать поток потока сообщений, слушая ответ.

Или вы можете просто сделать 1 поток, чтобы отправить запрос и получить ответ, получив ответ с узлом MQ Get. Это еще хуже, так как вам потребуется отключить транзакцию для вывода MQ, отправляющего запрос.

+0

Аттила, пожалуйста, уточните одну вещь. Если мы используем первый сценарий, мы будем иметь 3 потока. Один с запросом, один с TimeoutNotification и один с обработкой ответа, не так ли? Пример: запрос выполняется хорошо, получен ответ, но таймер продолжит работу и отправит сообщение в TimeoutNotification. Тогда ошибка будет отправляться в любом случае, если я правильно понимаю. Как этого избежать? –

+0

Правильно, у вас будет 3 потока. В потоке запроса вам нужно сохранить те идентификаторы сообщений, на которые вы ожидаете ответа. И вы удаляете идентификатор, когда получаете ответ. Таким образом, ваш поток тайм-аута отправляет ошибку только тогда, когда вы получаете тайм-аут с MsgId, который находится в списке. Узел TimeoutControl может хранить данные, которые будут отправляться узлу TimeoutNotification, в этих данных вы можете сохранить MsgId сообщения, для которого вы запускаете таймаут. И список MsgIds, на который вы ожидаете ответа, может быть сохранен любым способом, который наиболее подходит, в БД, в Q или в общих переменных, например. –