Domanda

Stiamo avendo un'applicazione MVC che legge i dati da MSMQ.Stiamo cercando di trovare un modo per leggere il messaggio dalla coda e rimuoverlo dalla coda solo se l'utente ha eseguito con successo un'operazione sulla coda.Il messaggio dovrebbe rimanere in coda finché l'utente non completa l'elaborazione, il messaggio non dovrebbe essere disponibile a nessun altro finché l'utente che sta elaborando l'oggetto del messaggio non ha terminato l'operazione.

Esiste una proprietà per un oggetto Message da impostare come Peeked che non consentirà nuovamente la lettura di questo messaggio finché non verrà rimesso in coda o rimosso dalla coda?

Non siamo sicuri che l'utilizzo di MSMQ sia una buona idea in questo caso?

È stato utile?

Soluzione

Sembra che tu debba utilizzare le tue code in modalità transazionale.Quindi, il tuo cliente può ricevere un messaggio, elaborarlo e Poi confermare la transazione, a quel punto il messaggio verrà finalmente rimosso dalla coda.Mentre la transazione è attiva, tuttavia, gli altri clienti non vedranno il messaggio: verrà trattenuto in riserva fino al completamento della transazione o all'interruzione.

Questo articolo di MSDN offre una discreta panoramica dei modelli di utilizzo per la messaggistica affidabile con MSMQ:

http://msdn.microsoft.com/en-us/library/ms978430.aspx

Altri suggerimenti

La coda è l'idea giusta. Il tuo approccio di "lasciare in coda, bloccato, ma ancora un po-di-disponibile" è sbagliato.

Potrebbe essere necessario più code.

  1. Processo A accoda qualcosa in coda 1

  2. Ritiri dalla coda Processo B dalla coda 1 e avvia il lavoro.

    • Se B è successo, questo è tutto.

    • In caso contrario, si ottiene in coda da qualche altra parte (forse la stessa coda, o forse coda 2) per il lavoro di follow-up.

Se è andata di nuovo in coda 1, B, la troverà ancora una volta, alla fine. Se è andato a un'altra coda, poi un altro processo fa di pulitura, la registrazione, correzione di errore o di qualsiasi altra cosa, eventualmente, mettere qualcosa di nuovo in coda 1.

Una coda non è un database - non c'è niente di stateful (no "non guardare a me, mi stanno elaborazione")

.

Una coda è di stoccaggio transitorio. Qualcuno scrive, qualcun altro si legge, e questo è tutto.


Se si vuole affidabilità, leggere questo: http://msdn.microsoft .com / it-it / library / ms978430.aspx

E questo: http: //blogs.msdn. com / shycohen / archive / 2006/02/20 / 535717.aspx

E questo: http: //www.request-response.com/blog/PermaLink,guid,03fb0e40-b446-42b5-ad90-3be9b0260cb5.aspx

L'affidabilità è una caratteristica della coda, non la vostra applicazione. Si può fare una "lettura recuperabili". E 'un'operazione che fa parte delle API coda.

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