Condividi tramite


Gestire i messaggi di errore di Service Broker

Si applica a:SQL ServerIstanza gestita di SQL di Azure

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 usa Service Broker e messaggi di sistema creati da Service Broker.

Segnalare le 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. La parte ricevente dell'applicazione deve essere programmata per rilevare un messaggio di errore e gestire correttamente la condizione di errore.

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

Messaggi di errore definiti dal sistema

Usare la WITH ERROR clausola dell'istruzione END CONVERSATION per segnalare gli errori dell'applicazione sufficientemente gravi da richiedere la fine della conversazione. Ad esempio:

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

Istruzione END CONVERSATION WITH ERROR :

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

  • Termina il lato locale della conversazione.

La parte dell'applicazione che riceve il Error messaggio deve eseguire qualsiasi pulizia necessaria e terminare il lato della conversazione.

Un'applicazione può terminare una conversazione attiva con un errore in qualsiasi momento. Tuttavia, se il lato remoto della conversazione è già terminato, Service Broker non invia il messaggio di errore al lato remoto. ma 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 usare messaggi di errore definiti dall'applicazione per segnalare errori non sufficientemente gravi da terminare una conversazione. La finestra di progettazione applicazioni può specificare quanto segue:

  • Uno o più tipi di messaggio usati per comunicare questi errori dell'applicazione.
  • La logica di gestione di questi tipi di messaggio.

La parte dell'applicazione che rileva la condizione di errore può eseguire le seguenti operazioni:

  • Effettuare le operazioni di pulizia necessarie per il lato locale della conversazione.
  • Creare un messaggio usando il tipo di messaggio definito dall'applicazione e inviarlo nella conversazione.

La parte remota dell'applicazione che riceve il messaggio di errore deve essere programmata per riconoscere il messaggio di errore ed effettuare le operazioni di pulizia necessarie sul relativo lato della connessione.

Gestire i 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 quanto segue:

  • I messaggi di errore generati da un'applicazione che usa un tipo di messaggio di errore definito dall'applicazione.

  • Messaggi di errore generati da un'applicazione che usa la WITH ERROR clausola dell'istruzione END CONVERSATION . Questi messaggi di errore usano il https://schemas.microsoft.com/SQL/ServiceBroker/Error tipo di messaggio e hanno un numero positivo nell'elemento Code .

  • Messaggi di errore generati da Service Broker. Questi messaggi di errore usano il tipo di messaggio https://schemas.microsoft.com/SQL/ServiceBroker/Error e hanno un numero negativo nell'elemento Code. Service Broker crea un messaggio Error quando un errore impedisce a Service Broker di continuare la conversazione. Ad esempio, Service Broker non riesce a individuare il servizio di destinazione perché il servizio non esiste nell'istanza corrente e non esiste alcuna voce per il servizio nella tabella di routing. In questo caso, Service Broker crea un Error messaggio per la conversazione.

Il set di risultati restituito dall'istruzione RECEIVE contiene una message_type_name colonna. Il codice che riceve i messaggi di Service Broker usa message_type_name in genere per instradare ogni messaggio al codice che elabora il tipo di messaggio associato.

La logica esatta che il programma segue per gestire l'errore dipende dall'applicazione. Ad esempio, un programma che usa la conservazione dei messaggi richiede transazioni di compensazione quando l'attività ha esito negativo. Quando viene ricevuto un errore, il programma esegue una query sulla coda per individuare i messaggi che sono già stati elaborati, esegue transazioni di compensazione e quindi chiude la conversazione. Al contrario, se il programma deve soltanto registrare che si è verificato un errore, registra l'errore in una tabella di registrazione e chiude la conversazione.

L'elemento Code del https://schemas.microsoft.com/SQL/ServiceBroker/Error messaggio contiene il codice di errore. Error messaggi creati da un'applicazione che usa END CONVERSATION WITH ERROR hanno un valore positivo per il codice di errore. Error i messaggi generati da Service Broker contengono valori negativi per il codice di errore. Il Code valore nei messaggi generati da Service Broker è solo il valore negato dell'errore che ha causato il Error messaggio. Ad esempio, quando si verifica un errore di convalida XML (codice di errore 9615), il motore di database crea un Error messaggio con un Code elemento contenente il valore -9615.

Una volta che un'applicazione riceve un Error messaggio, il programma non può più inviare messaggi in tale conversazione. L'applicazione gestisce l'errore e quindi termina il relativo lato della conversazione. Se un'applicazione riceve un tipo di messaggio di errore definito dall'applicazione, la conversazione è ancora disponibile a meno che la parte remota dell'applicazione non sia stata eseguita END CONVERSATIONanche .

Le routine di gestione degli errori devono essere codificate, in modo da evitare messaggi non elaborabili. Per altre informazioni, vedere Gestire i messaggi non elaborabili.