Spring, JTA-TransactionManager config: die Unterstützung von Tomcat und JBoss
Ich habe eine web-Anwendung mit JPA und JTA mit Spring. Ich möchte zur Unterstützung von JBoss und Tomcat. Beim laufen auf JBoss, ich möchte die JBoss-eigenen TransactionManager und beim laufen auf Tomcat, die ich verwenden möchte, JOTM.
Habe ich beide Szenarien arbeiten, aber jetzt finde ich, dass ich scheinen, müssen zwei separate Spring-Konfigurationen für die beiden Fälle. Mit JOTM, ich Spring JotmFactoryBean
:
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction">
<bean class="org.springframework.transaction.jta.JotmFactoryBean"/>
</property>
</bean>
In JBoss, obwohl, ich nur brauche zu Holen "TransactionManager" von JNDI:
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<bean class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="resourceRef" value="true" />
<property name="jndiName" value="TransactionManager" />
<property name="expectedType"
value="javax.transaction.TransactionManager" />
</bean>
</property>
</bean>
Gibt es eine Möglichkeit, konfigurieren Sie diese so, dass die entsprechenden TransactionManager - JBoss oder JOTM - verwendet wird, ohne die Notwendigkeit für zwei verschiedene Konfigurations-Dateien?
org.springframework.transaction.jta.JotmFactoryBean
Klasse, so müssen Sie möglicherweise eine Kopie der Quelle von 2.5.x.InformationsquelleAutor Henning | 2008-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke Sie haben den Punkt verpasst von JNDI. JNDI war ziemlich viel geschrieben, um das problem zu lösen, die Sie haben!
Ich denke, Sie können es auf ein Niveau, so dass anstelle der Verwendung der "userTransaction" oder "transactionManager von JNDI", je nach Ihrer situation. Warum nicht fügen Sie die "JtaTransactionManager" JNDI. So schieben Sie die Konfiguration der JNDI, wo es sein soll, anstatt noch weitere Konfigurations-Dateien [ wie es nicht schon genug 😉 ].
InformationsquelleAutor David Newcomb
Können Sie PropertyConfigurerPlaceholder zu injizieren bean-Referenzen als auch als einfache Werte.
Zum Beispiel, wenn Sie Ihre Bohnen 'jotm' und 'jboss' dann könnte man auch injizieren Sie Ihr TM wie:
Dann können Sie swap-Transaktion Führungskräfte, die mit
Dies ist ein möglicher Ansatz. Siehe meine blog für ein ausführlicheres Beispiel.
Hoffe, das hilft.
InformationsquelleAutor toolkit
Wenn du mit Spring 2.5 die Sie verwenden können, <tx:jta-transaction-manager/>. Ich habe es nicht mit JBoss-aber es sollte funktionieren, für die Sie nach § 9.8 Application-server-spezifische integration aus der Feder Referenz-Handbuch.
InformationsquelleAutor Brian Matthews
Den
<tx:jta-transaction-manager/>
Ansatz Aussehen wird für einen Transaktions-manager, die in mehreren Standard-Speicherorte hier aufgelistet. Wenn Sie den JBoss-Transaktions-manager ist nicht in eine von diesen Orten, ich schlage vor, Sie verschieben Sie, wenn möglich, oder bewegen Sie es in Tomcat, so dass beide Container haben Ihre TM in der gleichen JNDI-Speicherort.InformationsquelleAutor Chochos
Nur hinzufügen, meine Erfahrungen hier, damit ich nicht wieder leiden die Erfahrung wieder.
Als bmatthews68, Chochos und diese Plakate gesagt haben, verwenden
<tx:jta-transaction-manager/>
im Spring-bean-Datei; es ist definitiv die richtige Ebene der Abstraktion, und es gibt keine Notwendigkeit, nichts extra auf der Feder Seite.Als für Tomcat, erklärte ich
<Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" />
im Standard/sharedconf/context.xml
- Datei, die Bindung zujava:comp/UserTransaction
. Da dies einer der Orte gesucht für das Frühjahr, sollten Sie nicht brauchen, etwas anderes zu tun.Einer gotcha obwohl: wenn, wie ich Sie verwenden Maven, stellen Sie sicher, schließen Sie alle Abhängigkeiten auf die
javax.transaction:jta
Glas oder legen Sie den Bereichprovided
. Sonst erleben Sie classloader Probleme.InformationsquelleAutor Darren Bishop