Pregunta

Tengo una aplicación web que usa JPA y JTA con Spring.Me gustaría admitir tanto JBoss como Tomcat.Cuando ejecuto en JBoss, me gustaría usar el TransactionManager propio de JBoss, y cuando ejecuto en Tomcat, me gustaría usar JOTM.

Tengo ambos escenarios funcionando, pero ahora encuentro que parece que necesito dos configuraciones de Spring separadas para los dos casos.Con JOTM, necesito usar Spring's JotmFactoryBean:

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

Sin embargo, en JBoss, sólo necesito recuperar "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>

¿Hay alguna forma de configurar esto para que se utilice el TransactionManager apropiado (JBoss o JOTM) sin la necesidad de dos archivos de configuración diferentes?

¿Fue útil?

Solución

Creo que no has comprendido el objetivo de JNDI.¡JNDI fue escrito prácticamente para resolver el problema que tienes!

Creo que puedes subir un nivel, así que en lugar de usar "userTransaction" o "transactionManager de JNDI" dependiendo de tu situación.¿Por qué no agregar "JtaTransactionManager" a JNDI?De esa manera, envía la configuración al JNDI donde se supone que debe estar en lugar de crear aún más archivos de configuración [como si ya no hubiera suficientes;)].

Otros consejos

Puede utilizar PropertyConfigurerPlaceholder para inyectar referencias de beans y valores simples.

Por ejemplo, si llamas a tus beans 'jotm' y 'jboss', entonces podrías inyectar tu TM como:

<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>

Luego puedes intercambiar administradores de transacciones usando

  • transacción.estrategia=jotm en un archivo de propiedades
  • -Dtransaction.strategy=jotm como propiedad del sistema

Este es un enfoque posible.Mira mi Blog para un ejemplo más completo.

Espero que esto ayude.

Si está utilizando Spring 2.5, puede utilizar <tx:jta-transaction-manager/>.No lo he usado con JBoss pero debería funcionarte según la sección 9.8 Integración específica del servidor de aplicaciones del manual de referencia de Spring.

El <tx:jta-transaction-manager/> El enfoque buscará un administrador de transacciones en varias ubicaciones predeterminadas. listado aquí.Si su administrador de transacciones JBoss no está en una de esas ubicaciones, le sugiero que lo mueva, si es posible, o lo mueva en Tomcat para que ambos contenedores tengan su TM en la misma ubicación JNDI.

Solo agrego mi experiencia aquí para no tener que volver a sufrir la experiencia.

Como bmatthews68, Chochos y estos carteles he dicho, usa <tx:jta-transaction-manager/> en su archivo Spring Bean;Definitivamente proporciona el nivel apropiado de abstracción y no hay necesidad de hacer nada adicional en el lado de Spring.

En cuanto a Tomcat, declaré <Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" /> en el valor predeterminado/compartido conf/context.xml archivo, que se une a java:comp/UserTransaction.Como este es uno de los lugares buscados por Spring, no deberías necesitar hacer nada más.

Sin embargo, uno te pilló:Si, como yo, utilizas Maven, asegúrate de excluir cualquier dependencia del javax.transaction:jta jar o establecer el alcance en provided.De lo contrario, experimentará problemas con el cargador de clases.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top