2009-09-30 4 views
2

У меня есть хранимая процедура, которая отправляет сообщение в очередь сообщений службы SQL Server Service Broker. Мне нужно вернуть сообщение об ошибке из хранимой процедуры, если что-то пойдет не так, и сообщение не будет помещено в очередь сообщений. Проблема, которую я вижу, заключается в том, что даже если служебный брокер SQL Server отключен (именно так я пытаюсь проверить отсутствие помещать сообщение в очередь), он не возвращает ошибку при запуске TSQL-кода для ввода сообщение в очереди.Обработка ошибок Брокер SQL Server

Кто-нибудь знает, как определить, не удалось ли отправить сообщение в очередь сообщений брокера SQL Server?

ответ

19

Сервисный брокер не размещает сообщение в целевой очереди. Вместо этого помещается в очередь передач базы данных (sys.transmission_queue). После того, как SEND зафиксирован, сообщение подхвачено фоновым передатчиком, маршрутизация разрешена и сообщение доставляется в пункт назначения.

Если место назначения находится в том же экземпляре, тогда путь доставки ярлыка выполняется во время самой инструкции SEND, в которой сообщение помещается прямо в очередь назначения. Если ошибка не удалась, сообщение возвращается и помещается в обычный путь доставки, то есть. положить в sys.trasnmission_queu e. Сообщение, застрявшее в sys.transmission_queue, будет содержать transmission_status, объясняющее, почему сообщение не может быть доставлено. Система автоматически повторит попытку этих сообщений.

Единственный раз, когда SEND может вернуть ошибку, когда сообщение не может быть отправлено , не тогда, когда она не может быть доставлен. Это было бы, если вы попытаетесь выполнить SEND в закрытом диалоге или если есть некорректная ошибка (только для чтения, полная запись, из памяти и т. Д.), Что предотвращает даже прием сообщения в sys.transmission_queue.

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

Способ обработки ошибок в Service Broker заключается в проверке собственной очереди на ответ. Если служба назначения активно отказывается от вашего сообщения (т. Е. Отказана в доступе или XML-malformat или нарушение договора на обслуживание), это приведет к завершению беседы с ошибкой, и вы получите сообщение об ошибке в своей собственной очереди. Если ваше сообщение просто не может быть доставлено, оно будет оставаться в очереди передачи до истечения срока его действия, а затем разговор заканчивается ошибкой, и снова сообщение об ошибке будет помещено в вашу собственную очередь. Срок действия сообщений после истечения срока службы, указанного с BEGIN CONVERSATION, истекает.

Так что в вашем случае, когда вы отключите брокер, сообщение по-прежнему принимается, но не доставляется. Он помещается в очередь передачи. Как только вы включите брокер в базу данных, это сообщение будет доставлено и доставлено. Такое поведение значительно упрощает написание приложений, когда важна надежность доставки. Приложение просто ОТПРАВЛЯЕТ, зная, что сообщение будет доставлено до, даже если пункт назначения недоступен (например, снят для обслуживания), даже если для доставки сообщения требуется несколько часов или дней или даже недель. Для приложений, которые касаются также времени доставки, они должны указывать время жизни разговора. Система попытается доставить сообщение в течение этой жизни или отказаться. Если он отказывается, он уведомляет отправителя, помещая сообщение об ошибке (ошибка тайм-аута разговора).

Также заявки не должны ждать для получения ответа.Они должны SEND, COMMIT и продолжить, be события, приводимые в действие. Когда цель отправляет ответ или когда базовая инфраструктура уведомляет об ошибке, приложение получает сообщение в своей собственной очереди, и оно должно ответить на это сообщение .

+0

Здравствуйте, Ремус. В случае сбоя отправки, например при попытке отправить неверный XML, статус передачи - «Service Broker» получил сообщение об ошибке в этом разговоре. Сервисный брокер не будет передавать сообщение; он будет проводиться до тех пор, пока приложение не завершит разговор ». Есть ли способ распознать такие сообщения в очереди? Моя автоматическая очередь отправителей обрабатывает их как обычные сообщения. – milez

+0

@milez задайте отдельный вопрос –

+0

http://stackoverflow.com/q/38436673/5110359 :) – milez

Смежные вопросы