example java spring jboss jta jotm

java - example - Configuración Spring Spring JTA TransactionManager: compatible con Tomcat y JBoss



spring 4 hibernate 4 example (5)

Puede usar PropertyConfigurerPlaceholder para inyectar referencias de bean, así como también valores simples.

Por ejemplo, si llama a sus granos ''jotm'' y ''jboss'', entonces podría inyectar su 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 puede intercambiar gerentes de transacciones usando

  • transaction.strategy = jotm en un archivo de propiedades
  • -Dtransaction.strategy = jotm como propiedad del sistema

Este es un enfoque posible. Ver mi blog para un ejemplo más completo.

Espero que esto ayude.

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

Tengo ambos escenarios en funcionamiento, pero ahora me parece que necesito dos configuraciones separadas de Spring 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>

En JBoss, sin embargo, solo necesito buscar "TransactionManager" desde 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 manera de configurar esto para que se utilice el TransactionManager apropiado, JBoss o JOTM, sin la necesidad de dos archivos de configuración diferentes?



El enfoque <tx:jta-transaction-manager/> buscará un administrador de transacciones en varias ubicaciones predeterminadas enumeradas aquí . Si su administrador de transacciones JBoss no se encuentra 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.


Creo que te has perdido el punto de JNDI. ¡JNDI fue escrito para resolver el problema que tienes!

Creo que puede subir de nivel, en lugar de usar "userTransaction" o "transactionManager de JNDI" según su situación. ¿Por qué no agregar el "JtaTransactionManager" a JNDI? De esta forma, debe enviar 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 fuera suficiente;)].


Solo agregué mi experiencia aquí para no tener que volver a sufrir la experiencia nuevamente.

Como bmatthews68, Chochos y estos carteles han dicho, use <tx:jta-transaction-manager/> en su archivo Spring bean; definitivamente proporciona el nivel apropiado de abstracción y no hay necesidad de hacer nada extra en el lado de Spring.

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

Sin embargo, hay que tener en cuenta que si, como yo, usas Maven, asegúrate de excluir cualquier dependencia en el jar javax.transaction:jta o establece el alcance como provided . De lo contrario, experimentarás problemas con el cargador de clases.