2012-02-14 9 views
9

Stiamo sviluppando un sistema con due logiche principali; Una è una logica di gestione, che è molto leggera; e l'altra è una logica di elaborazione, che consuma molto risorse (RAM + CPU).È possibile propagare una transazione tra EJB di diverse applicazioni in Weblogic?

Abbiamo deciso di avere una macchina per eseguire la logica di gestione e una (o più) altre macchine per eseguire la logica di elaborazione.
Per separare le logiche in macchine diverse, abbiamo creato un'applicazione (EAR) per ogni logica, che ci offre due applicazioni separate.

Ora, utilizziamo Weblogic come nostro server applicazioni e non abbiamo ancora configurato il nostro dominio per eseguire le applicazioni su macchine diverse.

Prima di farlo, vogliamo sapere; Quando un EJB dall'applicazione di gestione richiama un EJB dall'applicazione di elaborazione, la transazione si propaga? Se il bean di gestione effettuerà il rollback della sua transazione, il bean di elaborazione ne eseguirà il rollback? Questa funzione richiede una configurazione speciale del dominio?

risposta

6

Sì. Se segui le best practice e non provi nulla di stupido, le transazioni e i rollback si propagheranno entrambi. Questo è esattamente ciò che gli EJB sono progettati per fare! Se hai bisogno di aiuto su come iniettare correttamente gli EJB usando @EJB, un'ottima guida è Mastering EJB3.1 o la breve refcard EJB3.0 da JavaLobby.

EJB utilizzare la gestione dichiarativa delle transazioni, quindi sarà necessario per assicurarsi che si mette la dichiarazione corretta sul tuo Bean:

@Stateless 
@Remote({MyService.class}) 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class MyServiceBean implements MyService { 
    ...awesome code here 
} 

EDIT

Una nota importante è che è necessario disporre di un livello superiore EJB avvia la transazione per te e concatena tutte le chiamate ad altri EJB, oppure è necessario avviare una transazione manualmente prima di chiamare più EJB.

Se ci si trova in una servlet e si chiamano 6 EJB annotati con REQUIRED, si ottengono 6 transazioni, poiché il limite della transazione inizia da ogni chiamata a un EJB e termina con il metodo esistente.

Se si è in un EJB e si chiamano 6 bean aggiuntivi con annotazione con REQUIRED, si otterrà una transazione perché il limite della transazione è già stato avviato.

+0

All'inizio ho pensato che funzionasse, ma poi quando stavo cercando la risposta (non riesco a trovare i collegamenti ora) ho trovato che le specifiche sono piuttosto vaghe su questo argomento. Immagino che dovrò semplicemente provare. Nota a margine: faccio domande difficili; Non ottengo risposte/Ottengo risposte sbagliate/Ricevo risposta dicendo che non c'è soluzione. – wafwaf

+0

Questo è comprensibile :) –