Spring JTA TransactionManager config: Prise en charge de Tomcat et JBoss
J'ai une application web en utilisant JPA, et JTA avec le Printemps. Je tiens à soutenir à la fois JBoss et Tomcat. Lors de l'exécution sur JBoss, je voudrais utiliser JBoss propres TransactionManager, et lors de l'exécution sur Tomcat, je voudrais utiliser JOTM.
J'ai deux scénarios de travail, mais je trouve maintenant que je semble avoir besoin de deux configurations de Ressort pour les deux cas. Avec JOTM, j'ai besoin d'utiliser le Printemps JotmFactoryBean
:
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction">
<bean class="org.springframework.transaction.jta.JotmFactoryBean"/>
</property>
</bean>
Dans JBoss, si, j'ai juste besoin de récupérer "TransactionManager" de 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>
Est-il un moyen de configurer ce afin que les TransactionManager - JBoss ou JOTM - est utilisé, sans la nécessité pour les deux fichiers de configuration différents?
source d'informationauteur Henning
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez manqué le point de JNDI. JNDI était assez bien écrit pour résoudre le problème que vous avez!
Je pense que vous pouvez le prendre jusqu'à un niveau, donc au lieu de l'aide de la "un usertransaction" ou "transactionManager de JNDI" en fonction de votre situation. Pourquoi ne pas ajouter le "JtaTransactionManager" JNDI. De cette façon, vous poussez la configuration JNDI où il est censé être au lieu de créer encore plus de fichiers de configuration [ comme il n'y a pas assez déjà 😉 ].
Vous pouvez utiliser PropertyConfigurerPlaceholder à injecter de la fève de références ainsi que des valeurs simples.
Par exemple si vous appelez de vos haricots "jotm" et "jboss", alors vous pourrait injecter votre TM comme:
Ensuite, vous pouvez échanger les responsables de la transaction à l'aide de
C'est une approche possible. Voir mon blog pour un exemple plus complet.
Espère que cette aide.
Si vous êtes à l'aide de Spring 2.5, vous pouvez utiliser <tx:jta-les transactions manager/>. Je n'ai pas utilisé avec JBoss, mais il doit travailler pour vous, conformément à la section 9.8 serveur d'Application spécifique à l'intégration à partir du Printemps manuel de référence.
La
<tx:jta-transaction-manager/>
approche recherchez un gestionnaire de transactions dans plusieurs emplacements par défaut énumérées ici. Si votre JBoss gestionnaire de transactions n'est pas dans un de ces endroits, je vous suggère de passer, si possible, ou le déplacer dans Tomcat pour que les deux conteneurs ont leurs TM dans le même JNDI emplacement.Juste ajouter mon expérience ici, donc je n'ai pas de re-souffrir de l'expérience à nouveau.
Comme bmatthews68, Chochos et ces affiches avons dit, l'utilisation
<tx:jta-transaction-manager/>
dans votre Printemps bean fichier; il fournit certainement le niveau approprié de l'abstraction et il n'y a pas besoin de faire grand chose de plus sur le Printemps côté.Comme pour Tomcat, j'ai déclaré
<Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" />
dans le répertoire par défaut/partagéeconf/context.xml
fichier, qui se lie àjava:comp/UserTransaction
. Comme c'est l'un des endroits recherchés par le Printemps, vous ne devriez pas besoin de faire autre chose.Un gotcha: si comme moi vous utilisez Maven, assurez-vous d'exclure toutes les dépendances sur le
javax.transaction:jta
en pot ou en définir la portée deprovided
. Sinon, vous ferez l'expérience du chargeur de classe questions.