2010-06-30 7 views
6

SfondoTransazioni distribuite di primavera che coinvolgono le chiamate RMI possibili?

Ho applicazione Primavera client che le disposizioni di un servizio a due server che utilizzano RMI. Nel client salvi un'entità nel database (facile) e faccio chiamate rmi a due server con i dettagli dell'entità. Sto usando Spring 3.0.2 sui server e il client è un semplice sito Spring-mvc.

Requisiti

La mia esigenza è che se una qualsiasi delle chiamate RMI non riescono a server che l'intera transazione rollback, vale a dire l'entità non viene salvato sul client e se sia chiamata rmi era successo che anche questo torna indietro.

Sono relativamente nuovo alle transazioni distribuite, ma suppongo che voglio una transazione simile a XA utilizzando le chiamate RMI.

Ho trovato un collegamento piacevole sull'oggetto here ma non menziona il modello per quando si chiamano due chiamate di metodi remote a server diversi. Mi piacerebbe saperne di più sull'argomento in termini di lettura raccomandata e anche su qualsiasi suggerimento su come ottenere ciò usando la primavera. È possibile utilizzare un gestore delle transazioni per questo?

Grazie.

risposta

3

Ecco come si può teoricamente gestire questa situazione. Per prima cosa è necessario disporre di più gestori di transazioni distribuite JTA su ciascun nodo. Uno agisce come il padrone, l'altro come schiavo. Il master coordina il commit/rollback della transazione distribuita agli slave. Esistono implementazioni JTA stand alone, ad es. JOTM.

Vanilla RMI non supporta la propagazione delle informazioni di contesto come l'ID della transazione dell'operazione. Ma penso che RMI abbia dei ganci in modo che possa essere esteso per supportarlo. Puoi dare un'occhiata a Carol.

È necessario utilizzare XAResource per includere i partecipanti nella transazione in modo che possano essere inclusi nella transazione distribuita. Il master dovrà inviare messaggi di commit/rollback agli slave, che dovranno utilizzare XATerminator per agire di conseguenza.

La specifica JTA è solo una transazione distribuita manager, la registrazione delle operazioni in un log delle transazioni deve essere eseguita dai server. La libreria esiste per la gestione del log delle transazioni, ad es. HOWL.

Non penso che Spring possa essere utilizzato, anche con un gestore di transazioni distribuito, per farlo facilmente. Ho provato una volta a utilizzare RMI con transazione distribuita controllata da un client standalone e diversi slave. Ecco uno blog post su di esso. Era piuttosto complicato.

È possibile ottenere tutto ciò gratuitamente se si utilizza un server di applicazioni Java EE, con IIOP. IIOP supporta la propagazione delle transazioni distribuite. Il client può essere un application client container ed è possibile controllare le transazioni con UserTransaction. Questo è in realtà uno dei rari casi, in cui penso che l'utilizzo di un server delle applicazioni sia davvero giustificato.

Ma ciò detto, le transazioni distribuite sono cose complicate, che possono portare a errori euristici, timeout se un nodo muore e complicate procedure di ripristino.

Il mio ultimo consiglio sarebbe quindi: provare a trovare un disegno che non implichi transazioni distribuite se possibile. Questo ti renderà molto più facile.

È possibile trarre ispirazione da BPEL compensation mechanism. Esistono forse altri approcci progettuali per la gestione degli errori e la robustezza che possono evitare le transazioni distribuite di utilizzo.

+0

Grazie per aver trovato il tempo di rispondere così in profondità. –

1

Per quanto ne so, Spring in sé non gestisce le transazioni distribuite. Può utilizzare JtaTransactionManager che a sua volta delega a un coordinatore di transazioni di un server Java EE. Quindi, per quanto ne so, questo tipo di transazioni è disponibile solo attraverso le origini dati registrate nel contenitore delle applicazioni.

Si può provare a scrivere la propria implementazione XAResource (non è sicuro se è il modo migliore, ma ancora) e registrarlo nel contenitore delle applicazioni, ma Spring non ti aiuterà molto con quello.