Как справиться с ситуацией, если сообщение не придет в очередь по истечении тайм-аута. Возможно ли это с Message Broker?

Я думаю, что описал почти все, что мне нужно в заголовке. Итак, есть несколько потоков WMB. И один ждет ответа в очереди. Мне нужно создать исключение, если после тайм-аута в очереди не будет сообщения.

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


person Gleb    schedule 02.02.2017    source источник


Ответы (1)


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

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

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

  • Начать ждать ответа после отправки запроса

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

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

person Attila Repasi    schedule 02.02.2017
comment
Аттила, пожалуйста, проясните одну вещь. Если мы используем первый сценарий, у нас будет 3 потока. Один с запросом, один с TimeoutNotification и один с обработкой ответа, верно? Пример: запрос выполнен успешно, ответ получен, но таймер продолжает работать и выдает сообщение TimeoutNotification. Тогда ошибка все равно будет отправлена, если я правильно понимаю. Как этого избежать? - person Gleb; 06.02.2017
comment
Правильно, у вас будет 3 потока. В потоке запросов вам нужно сохранить идентификаторы сообщений, на которые вы ожидаете ответа. И вы удаляете идентификатор, когда получаете ответ. Таким образом, ваш поток тайм-аута отправляет ошибку только тогда, когда вы получаете тайм-аут с MsgId, который находится в списке. Узел TimeoutControl может хранить данные, которые будут отправлены узлу TimeoutNotification, в этих данных вы можете сохранить MsgId сообщения, для которого вы запускаете тайм-аут. И список MsgId, для которых вы ожидаете ответа, может быть сохранен любым наиболее подходящим способом, например, в БД, в Q или в общих переменных. - person Attila Repasi; 06.02.2017