Domanda

Ho una stored procedure che inserisce un messaggio su una coda di messaggi di SQL Server Service Broker. Ho bisogno di restituire un messaggio di errore dalla stored procedure, se qualcosa va storto e il messaggio non viene posto sulla coda di messaggi. Il problema che sto vedendo è che anche se il Service Broker di SQL Server è disattivata (che è come sto cercando di testare il fallimento di mettere un messaggio sulla coda) non restituisce un errore quando si esegue il codice TSQL di mettere un messaggio sulla coda.

Qualcuno sa come rilevare se mettere un messaggio su una coda di messaggi Broker di SQL Server fallito?

È stato utile?

Soluzione

Service Broker non pone il messaggio nella coda di destinazione. Invece è posto nella coda di trasmissioni di database ( sys.transmission_queue ). Dopo SEND si impegna il messaggio viene raccolto dal trasmettitore sfondo, l'instradamento è stato risolto e il messaggio viene recapitato a destinazione.

Se la destinazione capita di essere situata all'interno della stessa istanza poi un percorso di consegna scorciatoia viene tentata durante l'istruzione SEND stessa, in cui il messaggio viene inserito direttamente nella coda di destinazione. Se l'enqueue fallisce, allora il messaggio è rimbalzato indietro e collocato nel normale percorso di consegna, vale a dire. mettere in sys.trasnmission_queue. Un messaggio bloccato in sys.transmission_queue avrà un transmission_status che spiega il motivo per cui il messaggio non può essere consegnato. Il sistema automaticamente ri-tentare questi messaggi.

L'unico momento in cui il SEND può restituire un errore è quando il messaggio non può essere inviato , non quando non può essere Consegna . Questo sarebbe se si tenta di SEND una conversazione chiusa o se c'è qualche errore non mediatore (sola lettura del database, l'accesso pieno, di memoria, ecc), che impedisce anche accettando del messaggio in sys.transmission_queue.

Questo comportamento macking anche un asincrono consegna locale e debolmente accoppiati è intenzionale ed è progettato per aiutare le applicazioni comportandosi lo stesso quando la coda di destinazione è locale e quando la coda di destinazione è remota.

Il modo per gestire gli errori di Service Broker è controllando la propria coda per una risposta. Se il servizio di destinazione rifiuta attivamente il tuo messaggio (es. Accesso negato, o malformat XML, o violazione contratto di servizio) allora sarà terminare la conversazione con l'errore e si ottiene un messaggio di errore nella propria coda. Se il tuo messaggio semplicemente non può essere consegnato, allora rimarrà in coda di trasmissione fino alla scadenza e quindi la conversazione è terminata con l'errore, e ancora una volta un messaggio di errore verrà inserito nella propria coda. I messaggi time out dopo la durata specificata con BEGIN CONVERSATION scadenza.

Quindi nel tuo caso quando si disattiva il broker il messaggio è ancora accettato, ma non consegnati. Si trova nella coda transmsision. Non appena si attiva di nuovo il broker nel database, il messaggio sarà raccolto e consegnato. Questo comportamento rende l'applicazione molto più semplice la scrittura quando l'affidabilità di consegna è la preoccupazione principale. L'applicazione invia semplicemente sapendo che il messaggio si arrivare anche se la destinazione non è disponibile (ad es. Tirato giù per la manutenzione di servizio), anche se ci vogliono ore o giorni o addirittura settimane per il messaggio di essere consegnato. Per le applicazioni che si occupano anche con i tempi di consegna, essi dovrebbero specificare una vita conversazione. Il sistema tenterà di consegnare il messaggio all'interno di questa vita o rinunciare. Se rinuncia, lo comunica al mittente da enqueueing un messaggio di errore (l'errore di conversazione timeout).

Anche le applicazioni non dovrebbero attendere per una risposta. Dovrebbero SEND, COMMIT e continuare, essere Event Driven . Quando il bersaglio restituisce una risposta, o quando la Notifica di infrastruttura sottostanti di un errore, l'applicazione riceve un messaggio nella sua coda e dovrebbe reagire a quel messaggio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top