2008-09-22 27 views
10

Tengo una aplicación web que utiliza 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.Spring JTA TransactionManager config: Compatible con Tomcat y JBoss

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

<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, sólo tiene que ir a buscar "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 una manera de configurar esto para que el ¿se usa el TransactionManager apropiado - JBoss o JOTM -, sin la necesidad de dos archivos de configuración diferentes?

+0

Spring 3 ya no proporciona la clase 'org.springframework.transaction.jta.JotmFactoryBean', por lo que es posible que deba copiar la fuente de 2.5.x. – Jason

Respuesta

14

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

Creo que puede subir un nivel, por lo que en lugar de utilizar el "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;)].

4

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

Por ejemplo, si se llama a sus habas 'JOTM' y 'JBoss entonces se 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> 

A continuación, puede cambiar los administradores de transacciones utilizando

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

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

Espero que esto ayude.

2

Si está utilizando Spring 2.5 puede usar < tx: jta-transaction-manager/>. No lo he usado con JBoss pero debería funcionar para usted de acuerdo con la sección 9.8 Application server-specific integration del manual de referencia de Spring.

2

El enfoque <tx:jta-transaction-manager/> buscará un administrador de transacciones en varias ubicaciones predeterminadas listed here. 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.

1

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

Como bmatthews68, Chochos y these posters 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 predeterminado/compartido conf/context.xml, 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, si utilizas Maven, asegúrate de excluir cualquier dependencia del contenedor javax.transaction:jta o configura el ámbito en provided. De lo contrario, experimentarás problemas con el cargador de clases.

Cuestiones relacionadas