2010-02-12 13 views
20

Sto rivedendo un'applicazione client-server scritta in Java. Il server riceve i messaggi JMS e li elabora ma i messaggi possono arrivare in un ordine imprevisto e un annullamento può arrivare prima di un messaggio di ordine. Come gestisci un caso del genere? Lo fai nel mdb?Come gestire l'ordine dei messaggi in JMS?

Quali sono alcune strategie o modelli per questo tipo di scenario?

risposta

16

Finora sono a conoscenza della consegna "out-of-order" e fa parte degli attributi QoS (Quality of Service) del sistema JMS. Non penso che faccia parte delle specifiche JMS, ma alcuni provider lo supportano forse. Ciò dipenderà dalla particolare implementazione JMS che usi.

Si noti tuttavia che JMS ha lo scopo di distribuire i messaggi a diversi utenti in un modo per distribuire il carico. Se il messaggio deve essere consegnato in modo ordinato, ciò non è possibile - in pratica porta alla serializzazione della consegna del messaggio e il messaggio non può essere elaborato contemporaneamente.

Il wikipedia dice meglio di me:

coda JMS un'area di gestione temporanea che contiene i messaggi che sono stati inviati e sono in attesa di essere letto. Si noti che, , contrariamente a quanto suggerisce la coda nome , i messaggi non devono essere consegnati nell'ordine inviato. Se il pool di bean di messaggi contiene più di un'istanza, i messaggi possono essere elaborati contemporaneamente da e pertanto è possibile che sia un messaggio successivo che sia elaborato prima di uno precedente. Una coda JMS garantisce che solo ogni messaggio viene elaborato una sola volta.

La richiesta di annullamento fuori banda non è facile da ottenere con JMS. Due idee:

  • Memorizzare un ticket corrispondente a ciascun messaggio in un database potrebbe essere utilizzato per annullare facilmente il messaggio. Alla consegna del messaggio, l'MDB controlla se il biglietto corrispondente è ancora valido. Se sì, procede ulteriormente, in caso contrario, rilascia il messaggio.
  • Provare a impostare le dimensioni del pool MDB su una. Forse in questo caso, la consegna sarà ordinata. La modifica della dimensione del pool è app. server specifico, ma la maggior parte di essi supporta la dimensione del pool per bean.

Altrimenti, dare un'occhiata al modello message store. Vale comunque la pena controllare il sito web EAI.

+0

Grazie, darò un'occhiata a questo – user271858

8

Il sistema sarà molto più flessibile se è in grado di gestire i messaggi fuori servizio. Lo schema che ho usato per risolvere questo problema in passato è quello di utilizzare una coda di ritardo (su un sistema che elaborava 8 milioni di messaggi al giorno nel mondo finanziario).

Nel tuo esempio, se ho ricevuto un'eliminazione per un ordine che non avevo ancora ricevuto, lo ritarderei per un periodo di tempo e riprovare. Se non sapessi ancora nulla sull'ordine che mi viene chiesto di eliminare, avrei sollevato qualche tipo di errore (rispondere al mittente originale, inviare un messaggio a una coda di errore speciale, ...).

Per quanto riguarda l'implementazione della coda di ritardo, questa può essere un'altra coda JMS con un servizio che può accettare messaggi in ritardo. Quindi legge periodicamente i messaggi in ritardo e controlla se il periodo di tempo ritardato è scaduto e invia nuovamente il messaggio alla coda di destinazione originale.

+0

Grazie, darò un'occhiata a questo. – user271858

6

I secondo il consiglio di controllare il sito EAI e il libro su cui si basa (un fantastico testo su MOM e modelli MAM).

Personalmente, indicherei lo Resequencer, tuttavia.

+0

Grazie, darò un'occhiata a questo. – user271858