문제

Spring과 함께 JPA 및 JTA를 사용하는 웹 애플리케이션이 있습니다.JBoss와 Tomcat을 모두 지원하고 싶습니다.JBoss에서 실행할 때는 JBoss 자체의 TransactionManager를 사용하고 싶고, Tomcat에서 실행할 때는 JOTM을 사용하고 싶습니다.

두 가지 시나리오가 모두 작동하고 있지만 이제 두 경우에 대해 별도의 두 가지 Spring 구성이 필요한 것 같습니다.JOTM을 사용하려면 Spring의 기능을 사용해야 합니다. JotmFactoryBean:

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

하지만 JBoss에서는 JNDI에서 "TransactionManager"를 가져와야 합니다.

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

두 개의 서로 다른 구성 파일이 필요 없이 적절한 TransactionManager(JBoss 또는 JOTM)가 사용되도록 이를 구성하는 방법이 있습니까?

도움이 되었습니까?

해결책

나는 당신이 JNDI의 요점을 놓친 것 같습니다.JNDI는 여러분이 겪고 있는 문제를 해결하기 위해 작성되었습니다!

상황에 따라 "userTransaction"이나 "JNDI의 transactionManager"를 사용하는 대신 한 단계 더 발전시킬 수 있다고 생각합니다.JNDI에 "JtaTransactionManager"를 추가해 보는 것은 어떨까요?이렇게 하면 더 많은 구성 파일을 생성하는 대신(아직 충분하지 않은 것처럼) 구성을 JNDI에 푸시할 수 있습니다.

다른 팁

PropertyConfigurerPlaceholder를 사용하여 단순 값뿐만 아니라 빈 참조를 삽입할 수 있습니다.

예를 들어 빈을 'jotm' 및 'jboss'라고 부르면 다음과 같이 TM을 주입할 수 있습니다.

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

그런 다음 다음을 사용하여 트랜잭션 관리자를 교체할 수 있습니다.

  • transaction.strategy=jotm 속성 파일에서
  • -Dtransaction.strategy=jotm 시스템 속성으로

이는 가능한 접근 방식 중 하나입니다.내 것을 보아라 블로그 더 완전한 예를 들어 보겠습니다.

도움이 되었기를 바랍니다.

Spring 2.5를 사용하는 경우 <tx:jta-transaction-manager/>를 사용할 수 있습니다.JBoss와 함께 사용하지 않았지만 섹션에 따라 작동할 것입니다. 9.8 애플리케이션 서버별 통합 Spring 참조 매뉴얼에서.

그만큼 <tx:jta-transaction-manager/> 접근 방식은 여러 기본 위치에서 트랜잭션 관리자를 찾습니다. 여기에 나열됨.JBoss 트랜잭션 관리자가 해당 위치 중 하나에 없으면 가능하면 이를 이동하거나 Tomcat에서 이동하여 두 컨테이너 모두 동일한 JNDI 위치에 TM을 갖도록 하는 것이 좋습니다.

여기에 내 경험을 추가하면 그 경험을 다시 겪을 필요가 없습니다.

bmatthews68, Chochos 및 이 포스터들 말했다, 사용 <tx:jta-transaction-manager/> Spring 빈 파일에서;이는 확실히 적절한 수준의 추상화를 제공하며 Spring 측에서 추가 작업을 수행할 필요가 없습니다.

Tomcat에 관해서는 다음과 같이 선언했습니다. <Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" /> 기본/공유 conf/context.xml 바인딩하는 파일 java:comp/UserTransaction.이곳은 Spring이 검색한 곳 중 하나이므로 다른 작업을 수행할 필요가 없습니다.

그래도 한 가지 문제가 있습니다.나처럼 Maven을 사용한다면, Maven에 대한 종속성을 제외했는지 확인하세요. javax.transaction:jta jar 또는 범위를 다음으로 설정하십시오. provided.그렇지 않으면 클래스로더 문제가 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top