2016-07-18 17 views
0

Ich habe SQL Service Broker zwischen zwei Servern über das Netzwerk eingerichtet und es funktioniert in Ordnung. Ich implementiere gerade die Fehlerverarbeitung. Ich habe Prozeduren gespeichert, die beiden Warteschlangen zugeordnet sind, um Nachrichten zu verarbeiten.Erkennen MSSQL Service Broker Absender Seite Fehlermeldungen

In den Fällen, in denen das Senden einer Nachricht fehlschlägt, z. B. beim Versuch, fehlerhaftes XML zu senden, verbleibt die Nachricht in der Absenderwarteschlange. Der Übertragungsstatus lautet

Service Broker hat eine Fehlermeldung zu dieser Konversation erhalten. Service Broker wird die Nachricht nicht übertragen; Es wird gehalten, bis die Anwendung die Konversation beendet.

wenn die Warteschlange abfragt (Stored Procedures gedreht zum Debuggen off) mit select * from sys.transmission_queue, die is_conversation_error und is_end_of_dialog Felder sind 0 und message_type_name ist die gleiche I verwendet, wenn anstelle des üblichen Fehlertyp sendet.

Gibt es eine Möglichkeit, solche Nachrichten in der Warteschlange zu erkennen? Meine automatische Senderwarteschlange verarbeitet sie momentan als normale Nachrichten.

+0

Alternativ können Sie die Nachrichtenüberprüfung im Vertrag deaktivieren und bei der Verarbeitung der Nachricht auf der Empfangsseite in eine fehlerhafte Nachrichtentabelle einfügen, wenn Sie die Nachricht nicht in XML umwandeln können. –

+0

Es ist lustig, ich habe 'Validierung = None', aber es scheint immer noch XML zu überprüfen. – milez

+0

Seltsam. Sieht der Vertrag auf beiden Seiten so aus (d. H. Initiator und Ziel)? –

Antwort

1

Ein fehlerhafter XML-Fehler sendet eine Fehlermeldung an den Dialog zurück. Dies wird in Ihrer Anwendungswarteschlange in die Warteschlange eingereiht und Ihre App muss damit umgehen, da sie jede Fehlermeldung in ihrer Warteschlange behandeln muss.

Beachten Sie, dass Sie die Absender Warteschlange mit der transmission_queue verwechseln. Die Absenderwarteschlange ist eine normale Warteschlange, die mit CREATE QUEUE erstellt wurde und die Ihrem sendenden Dienst zugeordnete Warteschlange ist. Die Fehlermeldung, über die ich rede, wird in Ihrer Absenderwarteschlange abgelegt und Sie können sie unter abrufen. Die transmission_queue ist eine interne Tabelle im Besitz des Systems, die ausstehende Nachrichten enthält. Sie können nicht RECEIVE von der transmission_queue.

Ausgehend von Ihrem Beitrag Ich denke, Ihre Anwendung fehlt die Behandlung von Nachrichten in der Absenderwarteschlange. Auch wenn Ihr logischer Nachrichtenfluss immer von Service 'A' zu Service 'B' ist, müssen Sie Message-Behandlung für 'A' Servicewarteschlange ebenso haben. Wenn nichts anderes, ist es für die Handhabung von Fehlern erforderlich.

+0

Toller Punkt über die Warteschlangen zu verwirren! Ich habe eine Prozedur in der Absenderwarteschlange für den Empfang von Antworten auf Anfrage (in A - B - A Mode). Ich werde prüfen, ob ich mein Problem morgen lösen kann, wenn ich wieder an die Arbeit bin, danke für die Antwort. – milez

+0

Ja, da war es, mit Fehlerstatus, in der Absenderwarteschlange, als ich auf die falsche Warteschlange schaute. Vielen Dank! – milez