Domanda

È possibile avere più listener di messaggi trasportati da MSMQ?

WCF sembra inquadrare tutto in termini di servizi, rendendo la comunicazione un punto a punto. Voglio usare una coda di messaggi per bufferizzare il traffico in entrata per un altro processo che registra i log in un database.

Possono esserci un numero qualsiasi di altri processi interessati al monitoraggio del traffico in entrata, e ciò implora positivamente il modello Observer, ma non riesco a vedere come esprimere il modello Observer, almeno non usando MSMQ tramite WCF.

Qualcuno può consigliarmi su questo?


Alcuni retroscena del motivo per cui mi interessa, che possono anche servire a illustrare il problema: ho un servizio Windows che accetta richieste di connessione da piccole caselle nere nel campo. Imposta prese e le scatole nere inviano messaggi che descrivono eventi annotati con posizioni GPS nel tempo e nello spazio.

Analizzo i pacchetti di messaggi dal flusso del socket e li invio tramite MSMQ a un altro processo che filtra i duplicati e scrive i pacchetti in una tabella di database.

Esiste una quantità di post-elaborazione che trarrebbe vantaggio dal calcolo incrementale in risposta al traffico in entrata e gli strumenti utente eseguono la notifica dell'utente anche in risposta al traffico in entrata.

Quindi, mi piacerebbe davvero avere un processo per inviare i messaggi e diversi per riceverli. Uno di questi ricevitori è responsabile dell'analisi del contenuto del pacchetto e della trascrizione del messaggio in un database; questo è un candidato ovvio per la responsabilità di rimuovere finalmente il messaggio dalla coda, ma c'è la domanda su come assicurarsi che sia l'ultimo gestore a elaborare il messaggio.

È stato utile?

Soluzione

Non credo che MSMQ sia progettato in modo appropriato per gestire questa situazione da solo. Ci sono solo 2 cose che puoi fare per un messaggio: Peek () o Get (). AFAIK, non esiste un buon modo per tracciare se un messaggio è stato elaborato da tutti i gestori.

Ciò che potrebbe funzionare è avere il tuo processo che trascrive il messaggio come Observee e pubblicare il messaggio (forse usando l'architettura di eventi .NET) su tutti gli osservatori interessati prima di trascrivere il messaggio e scrivere nel database. Ciò garantirebbe che tutti gli osservatori interessati abbiano visto il messaggio e che il messaggio venga scritto nel DB in modo appropriato.

Altri suggerimenti

Penso che tu abbia bisogno di un Pubblica-Iscriviti canale :

  

In che modo il mittente può trasmettere un evento a tutti i destinatari interessati?    Invia l'evento su un canale Pubblica-Iscriviti, che consegna una copia di un particolare   evento per ciascun destinatario.

     

Un canale di pubblicazione-iscrizione funziona in questo modo: ha un canale di input   che si divide in più canali di output, uno per ciascun abbonato.   Quando un evento viene pubblicato nel canale, Pubblica-Abbonati   Channel consegna una copia del messaggio a ciascuno dei canali di output.   Ogni canale di uscita ha un solo abbonato, che è consentito solo a   consuma un messaggio una volta. In questo modo, ogni abbonato ottiene solo il   il messaggio una volta e le copie consumate scompaiono dai loro canali.

Questo modello è implementato su MSMQ da MassTransit e NServiceBus .

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