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 all'inoltro di messaggi.
Sintomo: 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 alcuni messaggi di errore 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. Il recapito dei messaggi di Service Broker potrebbe non essere attivato nel database. |
Sintomo: la route esiste ma lo stato della trasmissione indica che non è disponibile alcuna route per il servizio
Se la route è stata creata dopo il messaggio, la causa più comune di questo sintomo è il mancato tentativo di inviare nuovamente il messaggio dopo la creazione della route. 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 la route che specifica il nome del servizio esiste, per verificare il confronto è possibile eseguire una query analoga alla 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) ;
Per i nomi dei servizi visualizzati nel set dei risultati non esiste una corrispondenza esatta nella tabella di routing del database. Si noti che una route per la quale non è specificato un nome di servizio corrisponde a qualsiasi nome di servizio. Per ulteriori informazioni sul routing, vedere Routing di Service Broker.
Se nel messaggio è indicato un identificatore dell'istanza di Service Broker, controllare 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.
Sintomo: lo stato della trasmissione indica che l'istanza di Service Broker di destinazione non è raggiungibile
La destinazione non ha accettato il messaggio. Il nome del servizio specificato non corrisponde al nome del servizio ospitato dall'istanza di SQL Server di destinazione o la destinazione non contiene una route per il servizio. Per risolvere questo problema, verificare la configurazione del routing e del servizio della destinazione.
Sintomo: lo stato della trasmissione indica che il livello trasporto non è disponibile
Verificare l'esistenza di un endpoint di Service Broker con stato impostato su STARTED. Se un tale endpoint non esiste, crearlo. Per ulteriori informazioni sugli endpoint di Service Broker, 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).
Sintomo: 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. Si noti che Service Broker non utilizza il protocollo TDS (Tabular Data Stream). Nella route deve essere specificata la porta corrispondente a quella utilizzata dall'endpoint di Service Broker nell'istanza remota di SQL Server.
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. La configurazione della protezione del trasporto è descritta nell'argomento Protezione del trasporto di Service Broker.
Vedere anche
Attività
Procedura: Attivazione delle funzionalità di rete di Service Broker (Transact-SQL)
Concetti
Routing e funzionalità di rete di Service Broker
Endpoint di Service Broker
Routing di Service Broker
Avvio e interruzione di una coda
Altre risorse
sys.databases (Transact-SQL)
sys.transmission_queue (Transact-SQL)
sys.routes (Transact-SQL)
sys.service_broker_endpoints (Transact-SQL)