Messaggi di sistema di Service Broker
In Service Broker vengono utilizzati tre tipi di messaggi di sistema per comunicare informazioni sullo stato e sugli errori di Service Broker.
Gestione dei messaggi di sistema
La maggior parte dei messaggi di una conversazione di Service Broker è costituita da messaggi definiti dall'applicazione utilizzati per la comunicazione tra servizi. Ogni messaggio deve essere conforme a un formato del tipo di messaggio definito da un'istruzione CREATE MESSAGE TYPE. L'insieme di tipi di messaggi consentiti per una conversazione è definito dal contratto specificato nell'istruzione BEGIN DIALOG CONVERSATION.
Oltre ai tipi di messaggi definiti dall'applicazione specificati nel contratto, qualsiasi conversazione può ricevere anche messaggi che utilizzano uno dei tre tipi definiti dal sistema. Questi tipi di messaggi sono utilizzati da Service Broker per segnalare gli errori e lo stato dei dialoghi. In ogni applicazione deve essere presente una regola per la gestione dei messaggi di errore e dei messaggi di fine dialogo. Se tramite l'applicazione viene impostato un timer di conversazione per una conversazione di dialogo, l'applicazione deve contenere la logica per gestire i messaggi relativi al timer del dialogo. Service Broker fornisce questi tipi di messaggi per ogni servizio, indipendentemente dal fatto che siano o meno presenti nel contratto per il servizio. Per ulteriori informazioni, vedere Gestione dei messaggi di errore di Service Broker.
Messaggi di errore
Quando un servizio remoto termina un dialogo con un errore o l'istanza locale di Service Broker rileva un errore irreversibile in un dialogo, viene creato un messaggio di errore. I messaggi di errore sono di tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error e vengono convalidati come codice XML corretto.
Il documento XML contenuto in un messaggio di errore utilizza lo spazio dei nomi https://schemas.microsoft.com/SQL/ServiceBroker. L'elemento radice del documento, con il nome locale Error, contiene un elemento denominato Code e un elemento denominato Message. L'elemento Code contiene un valore integer. L'elemento Message contiene il testo leggibile del messaggio.
Ad esempio, un messaggio di errore generato da un servizio per l'elaborazione di rapporti spese può contenere il codice XML seguente (riformattato per migliorare la leggibilità):
<?xml version="1.0"?>
<Error xmlns="https://schemas.microsoft.com/SQL/ServiceBroker">
<Code>12</Code>
<Description>
Unknown cost center "127-1000". Please check the cost center list
and resubmit the report.
</Description>
</Error>
Un'operazione di ricezione riceve un messaggio di errore prima di qualsiasi altro messaggio del dialogo ad eccezione di un messaggio relativo al timer del dialogo. Questo avviene indipendentemente dall'ordine con cui il messaggio di errore è stato inserito nella coda. Quando in una coda sono presenti sia un messaggio relativo al timer del dialogo che un messaggio di errore, il messaggio relativo al timer raggiunge l'operazione di ricezione prima del messaggio di errore.
Dopo la ricezione di un messaggio di errore per un dialogo, se un'applicazione tenta di inviare un messaggio per tale dialogo, in Service Broker viene generato un errore. Un'applicazione, tuttavia, può ricevere eventuali messaggi rimanenti per il dialogo anche dopo la ricezione di un messaggio di errore.
Messaggi di fine dialogo
Quando un'applicazione termina un dialogo senza generare un errore, l'istanza locale di Service Broker invia un messaggio di fine dialogo all'istanza remota di Service Broker. I messaggi di fine dialogo sono del tipo https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog.
I messaggi di fine dialogo sono vuoti. Un'operazione di ricezione riceve un messaggio di fine dialogo nell'ordine in cui il messaggio è stato inserito nella coda.
Messaggi relativi al timer del dialogo
I messaggi relativi al timer del dialogo indicano che il timer di conversazione di un dialogo è scaduto. Questi messaggi sono di tipo https://schemas.microsoft.com/SQL/ServiceBroker/DialogTime. Un timer di conversazione è specifico di un lato della conversazione. Service Broker non invia mai un messaggio relativo al timer del dialogo all'altro lato della conversazione.
I messaggi relativi al timer del dialogo sono vuoti e raggiungono un'operazione di ricezione prima di qualsiasi altro messaggio per il dialogo, indipendentemente dall'ordine con cui il messaggio di timeout è stato inserito nella coda.
Vedere anche