2009-08-03 13 views
5

Utilizzo Oracle 11g per il mio database e la funzionalità AQ di Oracle Streams come implementazione JMS.Condivisione delle transazioni JMS e Hibernate in un MDB Spring utilizzando gli stream Oracle AQ?

Per quanto ne so, dovrebbe essere possibile implementare un POJO basato su messaggio Spring (MDP) che utilizza la stessa origine dati per l'accesso ai dati transazionali e le transazioni JMS - tutto senza XA-Transactions (IIRC, questo è stato commercializzato come funzionalità di SpringSource Advanced Pack per Oracle).

È possibile utilizzare anche Ibernazione? Idealmente, il mio MDP dovrebbe avviare una transazione JMS e leggere un messaggio da una coda, quindi riutilizzare la transazione per l'accesso ai dati tramite Hibernate. Se qualcosa va storto, la transazione JMS e il database verrebbero entrambi ripristinati, senza utilizzare il commit a 2 fasi (2PC).

Non sono un guru della transazione, quindi prima di iniziare a scavare più a fondo, qualcuno può confermare che ciò è possibile e ha senso anche?

Aggiornamento:
Quello che voglio è un'implementazione del Shared Transaction Resource pattern. Lo sample code lo dimostra per ActiveMQ e JDBC, ma ho bisogno di utilizzare gli stream Oracle AQ e Hibernate.

Update2: L'Advanced Pack SpringSource per Oracle è stato open sourced come parte della primavera dati JDBC e "fornisce la possibilità di utilizzare un unico gestore delle transazioni locale sia per database e un messaggio di accesso senza ricorrere a costosi distribuito 2 -phase commit gestione delle transazioni ".

risposta

3

2PC non dovrebbe essere necessario, come dici tu, dal momento che l'appserver dovrebbe occuparsene. Tuttavia, sarà necessario utilizzare le transazioni JTA (cioè il contenitore JavaEE) anziché le transazioni DataSource vanilla, poiché JMS funziona solo con JTA.

Questo non è un grosso problema, è solo un po 'più laborioso:

  1. vostra primavera config dovrebbe usare <jee:jndi-lookup/> per ottenere un riferimento del vostro contenitore DataSource, e si inietta la sorgente di dati nella tua SessionFactory ibernata sospesa gestita dalla molla .
  2. È quindi necessario introdurre un gestore delle transazioni nel contesto (<tx:jta-transaction-manager/> dovrebbe funzionare nella maggior parte dei server delle app).
  3. In Spring JMS MessageListenerContainer, inserire il riferimento sopra il gestore transazioni in esso.

Tutto ciò ha senso o dovrei elaborare? Questa configurazione deve assicurare che le transazioni gestite dal contenitore siano mantenute tra le interazioni JMS e Hibernate.

+0

+1. Mi chiedo tuttavia "tutto senza XA-Transactions (IIRC, questo è stato commercializzato come funzionalità di SpringSource Advanced Pack per Oracle)". Sono abbastanza sicuro che qualsiasi transazione che si estende su più nodi (ad esempio JMS e DA) deve essere una transazione XA e deve usare 2PC - mentre di solito viene eseguita da un container dietro la scena, è comunque fatta. Ho sbagliato? C'è qualche nuova straordinaria tecnologia che in qualche modo rende inutile? – ChssPly76

+0

Grazie per i vostri commenti. Ho aggiornato la mia domanda dopo aver scavato un po 'più a fondo. Come descritto nell'articolo a cui mi sono collegato, vorrei evitare del tutto JTA e XA. I documenti per [SpringSource Advanced Pack per Oracle] (https://www.springsource.com/products/enterprise/oraclepack) (scarica [qui] (http://www.springsource.com/downloads/springsource-advanced-pack -for-oracle-database-download)) menzionano anche la passibilità (vedi l'ultimo paragrafo del capitolo 3.2, che è troppo lungo per essere citato qui, sfortunatamente). –

+1

Non è possibile ottenere il coordinamento tx su origini dati e JMS senza JTA. – skaffman

Problemi correlati