2013-09-05 9 views
7

Stiamo costruendo un progetto di integrazione utilizzando Apache Camel (Camel 2.10.3, basato su Java DSL).Come rilevare la connessione JMS rotta/ripristinata in Apache Camel?

Abbiamo un percorso che estrae i dati da un database (chiamiamolo IN_DB), esegue alcune operazioni logiche e inserisce in un altro database (OUT_DB) una volta al giorno e un'altra route che si abbona a un argomento JMS per dati XML, qualche logica e la inserisce nello stesso database (OUT_DB) per tutto il giorno.

Il requisito è che quando la connessione dell'argomento JMS si interrompe per qualsiasi motivo, continuiamo a provare a riconnettersi indefinitamente e, una volta completata la riconnessione, è necessario tornare al database (IN_DB) e fare un altro carico per compilare il divario in cui l'argomento era giù.

La mia domanda è come possiamo fare questa logica ('Ero connesso, quindi sono disconnesso e ora sono di nuovo connesso') in Camel? Cosa succede al percorso che inizia con un argomento di consumo quando l'argomento si interrompe, la rotta si fermerà? O emetterà un messaggio di errore in qualche coda di errore? Devo scrivere il mio gestore per monitorare la connessione dell'argomento, o Camel si ricollegherà automaticamente quando l'argomento ritorna e imposta l'intestazione del messaggio, o imposta alcune variabili di contesto per indicare che "Ero connesso, quindi mi sono disconnesso e ora Sono connesso di nuovo 'è successo lo scenario? Sono felice di costruire la logica del percorso attorno al richiamo del carico del database. Non riesco a capire il modo migliore per 'rilevare' in Camel che questo scenario sia successo.

Eventuali suggerimenti molto apprezzati.

risposta

1

In termini di riconnessione alla coda, dipende da quale broker JMS si sta utilizzando. Se si sta utilizzando ActiveMQ, è possibile configurare la modalità di ricollegamento tramite l'URI in modo che possa provare e riconnettersi a un altro broker, riconnettersi allo stesso broker dopo un timeout, ecc. I documenti per esso sono here.

Per rilevare quando la connessione non è riuscita, il modo più semplice dal punto di vista del programma è utilizzare solo code persistenti anziché argomenti. Tuttavia, supponendo che non sia fattibile, penso che tu abbia due opzioni.

  1. Definire uno JMS exception listener. Questo dovrebbe farti sapere quando la connessione sottostante è scomparsa.

Per rilevare quando si esegue il backup di nuovo penso che si è bloccato con la pubblicazione di un messaggio per un argomento particolare e la visualizzazione di messaggi da questo argomento in un'altra rotta. Quando leggi un messaggio su questo argomento, sai che il broker è tornato in su in modo da poter ricaricare i tuoi dati dal DB.

o 2. È possibile pubblicare messaggi hearbeat regolari sul proprio argomento JMS. Se smetti di riceverli, sai che il broker è andato giù. Una volta che inizi a riprenderli, sai che è di nuovo disponibile e devi ricaricare i dati dal DB.

+0

Grazie Matt, alcuni suggerimenti eccellenti qui. Sfortunatamente, non possediamo gli argomenti a cui ci stiamo iscrivendo (broker EMS Tibco) e ci stiamo connettendo con account di sola lettura che rendono l'heartbeat un approccio un po 'complicato. Da dove verrà lanciata l'eccezione JMS? Lo stesso JMSComponent o il percorso che ne consuma? – Matt

+0

Sembra essere un po 'bloccato per le opzioni! Non ho un esempio da dare, ma il listener delle eccezioni è registrato sulla connessione, quindi l'eccezione dovrebbe essere generata dalla connessione piuttosto che da qualche parte nel percorso. La tua unica altra opzione è di interrogare regolarmente IN_DB per vedere se ha dei messaggi che non conosci, ma sospetto che non sia neanche pratico. –