Verifica dell'esistenza di un MessageQueue remoto (utilizzando C #)
Domanda
Come posso sapere se una coda di messaggi remoti esiste ? La documentazione afferma che "esiste" " il metodo non funziona per macchine remote.
Quanto segue non è valido (so che il percorso della coda è accurato poiché sono in grado di inviare messaggi alla coda):
if (!MessageQueue.Exists(@"FormatName:Direct=TCP:192.168.2.58\Private$\MyQueue")) throw new InvalidOperationException("Queue does not exist");
Il problema è che l'invio di un messaggio a un indirizzo di rete che non ha una coda di ascolto dietro di esso non provoca un'eccezione. Avere un'eccezione generata per un indirizzo di coda non valido è fondamentale per la nostra applicazione.
Soluzione
C'è un articolo su questo:
L'approccio alternativo di Frank è quello di utilizzare altre funzionalità che MSMQ fornisce, ad esempio messaggi di riconoscimento negativi con code di amministrazione.
Quello che dovrebbe succedere è che:
- il messaggio verrà recapitato correttamente alla coda di destinazione
- un riconoscimento negativo (NACK) verrà restituito a coda di amministrazione con una classe di " La coda di destinazione no esistere. " (MQMSG_CLASS_NACK_BAD_DST_Q) In alternativa puoi usare journaling fonte negativa e, in caso di mancata consegna, dovrebbe vedere il stessa classe di NACK nel corrispondente "messaggio di lettera morta" sistema coda.
In sintesi, non controllare se la coda esiste ma gestisci invece il file mancata consegna del messaggio nel caso in cui la coda non lo facesse esistere.
Altri suggerimenti
Cosa succede se il telecomando Q è stato controllato da una terza parte in cui non si ha alcun controllo?
Faresti meglio a fare qualche tipo di controllo del timeout invece di fare affidamento su informazioni remote.