Gestione dei messaggi di errore di Service Broker

Le applicazioni di Service Broker devono gestire due tipi di messaggi di errore ricevuti dalle conversazioni, ovvero messaggi di errore creati da un'applicazione che utilizza Service Broker e messaggi di sistema creati da Service Broker.

Segnalazione di condizioni di errore dell'applicazione

Le applicazioni di Service Broker sono in genere sistemi costituiti da codice eseguito in modo asincrono in computer diversi. Le parti di un'applicazione comunicano mediante messaggi inviati in conversazioni di Service Broker. La parte dell'applicazione in un lato di una conversazione di Service Broker può segnalare errori dell'applicazione all'altro lato inviando messaggi di errore. Nella parte ricevente dell'applicazione deve essere presente codice per il rilevamento di un messaggio di errore e per la gestione corretta della condizione di errore.

Per comunicare gli errori, le applicazioni di Service Broker possono utilizzare tipi di messaggi definiti dal sistema o dall'applicazione.

Messaggi di errore definiti dal sistema

Utilizzare la clausola WITH ERROR dell'istruzione END CONVERSATION per segnalare errori dell'applicazione abbastanza gravi da richiedere la terminazione della conversazione. Esempio:

END CONVERSATION @ConversationHandle
    WITH ERROR = 1234 DESCRIPTION = "The account specified in the invoice does not exist, verify the account number."

L'istruzione END CONVERSATION WITH ERROR consente di effettuare le operazioni seguenti:

  • Generazione di un messaggio di errore di sistema di Service Broker e invio del messaggio al lato remoto della conversazione. I messaggi di errore utilizzano il tipo di messaggio definito dal sistema https://schemas.microsoft.com/SQL/ServiceBroker/Error.

  • Terminazione del lato locale della conversazione.

La parte dell'applicazione che riceve il messaggio Error deve eseguire tutte le operazioni di pulizia necessarie e terminare il proprio lato della conversazione.

Un'applicazione può terminare una conversazione attiva in qualsiasi momento restituendo un errore. Se il lato remoto della conversazione tuttavia ha già terminato la conversazione, il messaggio di errore non verrà inviato al lato remoto, ma Service Broker termina solo il lato locale della conversazione e rimuove tutti i messaggi relativi alla conversazione dalla coda locale.

Messaggi di errore definiti dall'applicazione

È possibile utilizzare i messaggi di errore definiti dall'applicazione per segnalare errori non abbastanza gravi da terminare una conversazione. Il progettista dell'applicazione può specificare gli elementi seguenti:

  • Uno o più tipi di messaggi utilizzati per comunicare questi errori dell'applicazione.

  • Logica per la gestione di questi tipi di messaggi.

La parte dell'applicazione in cui si verifica la condizione di errore può effettuare le operazioni seguenti:

  • Esecuzione di tutte le operazioni di pulizia necessarie per il lato locale della conversazione.

  • Creazione di un messaggio utilizzando il tipo di messaggio definito dall'applicazione e invio del messaggio alla conversazione.

Nella parte remota dell'applicazione che riceve il messaggio di errore deve essere presente codice per riconoscere il messaggio di errore e per eseguire tutte le operazioni di pulizia necessarie nel proprio lato della connessione.

Gestione dei messaggi di errore

Nel codice dell'applicazione che riceve messaggi dalle conversazioni di Service Broker deve essere presente la logica per elaborare i messaggi di errore ricevuti dalla conversazione. Il codice deve rilevare e gestire gli elementi seguenti:

  • Messaggi di errore generati da un'applicazione che utilizza un tipo di messaggio di errore definito dall'applicazione.

  • Messaggi di errore generati da un'applicazione che utilizza la clausola WITH ERROR dell'istruzione END CONVERSATION. Per tali messaggi viene utilizzato il tipo di messaggio https://schemas.microsoft.com/SQL/ServiceBroker/Error e nel relativo elemento Code è presente un numero positivo.

  • Messaggi di errore generati da Service Broker. Per tali messaggi viene utilizzato il tipo di messaggio https://schemas.microsoft.com/SQL/ServiceBroker/Error e nel relativo elemento Code è presente un numero negativo. In Service Broker viene creato un messaggio Error quando un errore provoca l'impossibilità per Service Broker di continuare la conversazione. Se ad esempio Service Broker non è in grado di individuare il servizio di destinazione perché il servizio non esiste nell'istanza corrente e se non è presente alcuna voce per il servizio nella tabella di routing, in Service Broker viene creato un messaggio Error relativo alla conversazione.

Il set di risultati restituito dall'istruzione RECEIVE contiene una colonna message_type_name. Il codice che riceve i messaggi di Service Broker utilizza in genere la colonna message_type_name per eseguire il routing di ogni messaggio a codice che elabora il tipo di messaggio associato.

La logica esatta seguita da un programma per gestire gli errori dipende dall'applicazione. Un esempio è rappresentato da un programma che utilizza la funzionalità di memorizzazione dei messaggi e per cui sono necessarie transazioni di compensazione quando non è possibile eseguire correttamente l'attività. Quando viene ricevuto un errore, il programma esegue una query sulla coda relativa ai messaggi già elaborati, effettua le transazioni di compensazione, quindi termina la conversazione. Al contrario, se il programma deve registrare solo che si è verificato un errore, l'errore viene inserito nella tabella di registrazione e la conversazione viene terminata.

Il codice di errore è contenuto nell'elemento Code del messaggio https://schemas.microsoft.com/SQL/ServiceBroker/Error. Per i messaggi Error creati da un'applicazione che utilizza END CONVERSATION WITH ERROR il codice di errore ha un valore positivo, mentre i messaggi Error generati da Service Broker contengono valori negativi per il codice di errore. Il valore Code in messaggi generati da Service Broker è semplicemente il valore negativo dell'errore che ha provocato il messaggio Error. Quando ad esempio si verifica un errore di convalida XML (codice di errore 9615), nel Motore di database viene creato un messaggio Error il cui elemento Code contiene il valore -9615.

Dopo che un'applicazione ha ricevuto un messaggio Error, il programma non può più inviare messaggi alla conversazione specifica. L'applicazione gestisce l'errore, quindi termina il proprio lato della conversazione. Se un'applicazione riceve un tipo di messaggio di errore definito dall'applicazione, la conversazione è ancora disponibile a meno che anche la parte remota dell'applicazione non abbia eseguito END CONVERSATION.

Le routine di gestione degli errori devono essere codificate in modo da impedire la presenza messaggi non elaborabili. Per ulteriori informazioni, vedere Gestione di messaggi non elaborabili.