Question

J'ai une application Web utilisant JPA et JTA avec Spring. J'aimerais soutenir JBoss et Tomcat. Lors de l'exécution sur JBoss, j'aimerais utiliser le propre logiciel TransactionManager de JBoss, et lorsqu'il est exécuté sur Tomcat, j'aimerais utiliser JOTM.

Les deux scénarios fonctionnent, mais je constate à présent qu'il me semble avoir besoin de deux configurations Spring distinctes pour les deux cas. Avec JOTM, je dois utiliser le JotmFactoryBean de Spring:

<bean id="transactionManager" 
 class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="userTransaction">
        <bean class="org.springframework.transaction.jta.JotmFactoryBean"/>
    </property>
</bean>

Toutefois, dans JBoss, il me suffit 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>

Y a-t-il un moyen de configurer cela de sorte que le TransactionManager approprié - JBoss ou JOTM - soit utilisé, sans avoir besoin de deux fichiers de configuration différents?

Était-ce utile?

La solution

Je pense que vous avez manqué le but de JNDI. JNDI a été écrit pour résoudre le problème que vous avez!

Je pense que vous pouvez passer à un niveau supérieur. Par conséquent, au lieu d'utiliser l'option "userTransaction". ou " transactionManager de JNDI " en fonction de votre situation. Pourquoi ne pas ajouter le " JtaTransactionManager " à JNDI. De cette façon, vous transmettez la configuration au JNDI où elle est supposée se trouver au lieu de créer encore plus de fichiers de configuration [comme il n’y en a pas assez;)].

Autres conseils

Vous pouvez utiliser PropertyConfigurerPlaceholder pour injecter des références de beans ainsi que des valeurs simples.

Par exemple, si vous appelez vos haricots 'jotm' et 'jboss', vous pouvez alors injecter votre MT comme:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE">
    <property name="location" value="classpath:/path/to/application.properties"/>
</bean>
<bean id="jotm">...</bean>
<bean id="jboss">...</bean>
<bean id="bean-requiring-transaction-manager">
    <property name="transactionManager" ref="${transaction.strategy}"/>
</bean>

Ensuite, vous pouvez échanger des gestionnaires de transactions à l'aide de

.
  • transaction.strategy = jotm dans un fichier de propriétés
  • -Dtransaction.strategy = jotm en tant que propriété système

C’est une approche possible. Voir mon blog pour un exemple plus complet. .

J'espère que cela vous aidera.

Si vous utilisez Spring 2.5, vous pouvez utiliser < tx: jta-transaction-manager / > ;. Je ne l'ai pas utilisé avec JBoss mais cela devrait fonctionner pour vous conformément à la section 9.8 Intégration spécifique au serveur d'applications du manuel de référence de Spring.

L'approche < tx: jta-transaction-manager / > recherche un gestionnaire de transactions dans plusieurs emplacements par défaut répertoriés ici . Si votre gestionnaire de transactions JBoss ne se trouve pas dans l'un de ces emplacements, je vous suggère de le déplacer si possible ou de le déplacer dans Tomcat afin que les deux conteneurs aient leur MT dans le même emplacement JNDI.

J'ajoute simplement mon expérience ici pour que je ne subisse plus l'expérience.

Comme bmatthews68, Chochos et ces affiches ont dit, utilisez < tx: jta-transaction-manager / > dans votre fichier de bean Spring; il fournit certainement le niveau d'abstraction approprié et il n'y a pas besoin de faire quoi que ce soit du côté de Spring.

Comme pour Tomcat, j'ai déclaré < Transaction factory = & org; ob.web.jotm.UserTransactionFactory " jotm.timeout = " 60 " / > dans le fichier par défaut / shared conf / context.xml , qui se lie au java: comp / UserTransaction . Comme il s’agit de l’un des endroits recherchés par Spring, vous ne devriez rien faire d’autre.

Cependant, si vous utilisez Maven, assurez-vous d’exclure toute dépendance du fichier jar javax.transaction: jta ou définissez la portée sur fourni . Sinon, vous rencontrerez des problèmes de chargeur de classe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top