Risoluzione dei problemi relativi al routing e al recapito dei messaggi

In questa sezione vengono forniti suggerimenti per la risoluzione di problemi comuni correlati al routing e al recapito di messaggi.

Tecnica: diagnosi del recapito dei messaggi

Se i messaggi non vengono recapitati correttamente tra due servizi, utilizzare l'utilità ssbdiagnose per generare un report relativo agli errori di runtime di una conversazione. Nel report relativo agli errori di runtime verranno visualizzati gli eventuali errori rilevati dalle operazioni di conversazione. Se vengono rilevati errori, ssbdiagnose analizzerà anche la configurazione tra i servizi e segnalerà eventuali problemi di configurazione individuati. Per ulteriori informazioni, vedere Utilità ssbdiagnose.

Problema: i messaggi rimangono nella coda di trasmissione

Verificare che la funzionalità di recapito dei messaggi di Service Broker sia attivata nel database. Nella colonna is_broker_enabled di sys.databases è indicato se il recapito dei messaggi di Service Broker è attivato, come illustrato nell'esempio seguente:

SELECT is_broker_enabled FROM sys.databases
WHERE database_id = DB_ID() ;

Il recapito dei messaggi di Service Broker può essere disattivato per impedire il recapito dei messaggi al database errato. Per ulteriori informazioni sul recapito dei messaggi di Service Broker, vedere Gestione delle identità di Service Broker. Per ulteriori informazioni sull'attivazione del recapito dei messaggi di Service Broker, vedere Procedura: Attivazione del recapito dei messaggi di Service Broker nei database (Transact-SQL).

Se il recapito dei messaggi di Service Broker è attivo, controllare i messaggi nella colonna transmission_status nella vista del catalogo sys.transmission_queue. Di seguito sono riportati i messaggi di errore più comuni:

Messaggio

Descrizione

Nessuna route per il servizio.

Service Broker non è in grado di individuare una route per il servizio specificato.

Impossibile raggiungere l'istanza di Service Broker di destinazione.

Service Broker non è in grado di recapitare il messaggio all'istanza di Service Broker di destinazione.

Livello trasporto non disponibile.

Nell'istanza non esistono endpoint di Service Broker o l'endpoint di Service Broker non è stato avviato correttamente.

Coda di destinazione disattivata.

L'opzione STATUS della coda utilizzata dal servizio di destinazione è impostata su OFF. Service Broker non aggiunge nuovi messaggi a una coda con STATUS corrispondente a OFF.

Errore durante la ricezione dei dati: "10054 (Connessione in corso interrotta forzatamente dall'host remoto)".

Il lato remoto della conversazione ha accettato la connessione TCP/IP che tuttavia è stata chiusa prima di consentire l'invio di un messaggio.

(Nessuno)

Service Broker non ha ancora tentato di inviare il messaggio. Se la colonna enqueue_time indica che il messaggio è rimasto nella coda per molto tempo, è possibile che il recapito di messaggi di Service Broker non sia stato attivato nel database.

Problema: la route esiste ma lo stato della trasmissione indica che non è disponibile alcuna route per il servizio

Di seguito sono riportate le cause più comuni di questo problema:

  • L'istruzione SEND ha creato il messaggio quando non esisteva alcuna route per recapitarlo.

  • La route è stata quindi creata, ma Service Broker non ha ancora tentato di ripetere l'invio del messaggio.

Per ulteriori informazioni sull'esecuzione di ulteriori tentativi, vedere Routing e funzionalità di rete di Service Broker.

Verificare che il nome del servizio specificato nel messaggio corrisponda esattamente al nome specificato nella route. Per trovare la corrispondenza tra i nomi dei servizi, Service Broker utilizza un confronto byte per byte. Se esiste una route che specifica il nome del servizio, è possibile confrontare i nomi eseguendo la query seguente:

SELECT N'No Exact Match' = tq.to_service_name
FROM sys.transmission_queue AS tq
WHERE NOT EXISTS
    (SELECT remote_service_name
     FROM sys.routes AS routes
     WHERE tq.to_service_name = routes.remote_service_name) ;

[!NOTA]

Alcuni nomi di servizio possono apparire nel set di risultati anche se corrispondono a una route. Una route che non specifica un nome del servizio (remote_service_name = NULL) corrisponderà al nome del servizio utilizzato con qualsiasi messaggio.

Per ulteriori informazioni sulle route di Service Broker, vedere Routing di Service Broker.

Se nel messaggio è indicato un identificatore dell'istanza di Service Broker, verificare che nella route sia specificato lo stesso identificatore dell'istanza di Service Broker o che non sia specificato alcun identificatore.

Verificare che la route non sia scaduta. Nella colonna relativa alla durata della vista del catalogo sys.routes sono indicate la data e l'ora di scadenza della route.

Problema: lo stato della trasmissione indica che l'istanza di Service Broker di destinazione non è raggiungibile

La destinazione non ha accettato il messaggio. Questo problema può indicare che il nome del servizio specificato non corrisponde al nome di un servizio ospitato nell'istanza di SQL Server di destinazione. Può inoltre indicare che la destinazione non contiene una route per il servizio. Per risolvere questo problema, verificare la configurazione del routing e del servizio della destinazione.

Problema: lo stato della trasmissione indica che il livello trasporto non è disponibile

Verificare che esista un endpoint di Service Broker. Se non esiste alcun endpoint, crearne uno. Se invece esiste, verificare che il relativo stato sia STARTED. Per ulteriori informazioni, vedere Endpoint di Service Broker. Per ulteriori informazioni sulla creazione di un endpoint, vedere Procedura: Attivazione delle funzionalità di rete di Service Broker (Transact-SQL).

Problema: lo stato della trasmissione indica che la connessione in corso è stata interrotta forzatamente dall'host remoto

La protezione del trasporto potrebbe non essere configurata correttamente o l'indirizzo TCP/IP della route specifica una porta utilizzata da un servizio diverso da Service Broker.

[!NOTA]

La porta specificata nella route deve corrispondere alla porta utilizzata dall'endpoint di Service Broker nell'istanza remota del Motore di database. Per trasmettere i messaggi, Service Broker utilizza i protocolli di comunicazione di Service Broker anziché il protocollo Tabular Data Stream utilizzato per la trasmissione di batch e risultati di Transact-SQL. Pertanto, la porta utilizzata da un endpoint di Service Broker è diversa da quella utilizzata per la trasmissione di Transact-SQL.

Verificare che nella configurazione dell'endpoint di Service Broker le impostazioni di protezione di rete delle due istanze siano compatibili. Se l'endpoint di un'istanza di Service Broker è impostato su REQUIRED o ENABLED, l'endpoint di Service Broker per l'altra istanza deve avere un'impostazione diversa da NONE.

Verificare certificati, utenti e autorizzazioni per la protezione del trasporto di Service Broker. Per ulteriori informazioni, vedere Protezione del trasporto di Service Broker.