10

Spring で JPA と JTA を使用する Web アプリケーションがあります。JBoss と Tomcat の両方をサポートしたいと思います。JBoss で実行する場合は JBoss 独自の TransactionManager を使用し、Tomcat で実行する場合は JOTM を使用したいと考えています。

両方のシナリオが機能していますが、2 つのケースには 2 つの個別の 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>

2 つの異なる構成ファイルを必要とせずに、適切な TransactionManager (JBoss または JOTM) が使用されるようにこれを構成する方法はありますか?

4

5 に答える 5

14

JNDIの要点を見逃していると思います。JNDI は、あなたが抱えている問題を解決するためにほとんど書かれています!

状況に応じて「userTransaction」または「JNDIのtransactionManager」を使用する代わりに、レベルを上げることができると思います。「JtaTransactionManager」を JNDI に追加してみませんか。そうすれば、さらに多くの構成ファイルを作成する代わりに、構成を JNDI にプッシュすることができます [まだ十分ではありません ;)]。

于 2009-01-06T15:33:51.070 に答える
4

PropertyConfigurerPlaceholderを使用して、単純な値だけでなくBean参照も挿入できます。

たとえば、Beanを「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

これは1つの可能なアプローチです。より完全な例については、私のブログを参照してください。

お役に立てれば。

于 2008-09-22T21:51:16.610 に答える
2

このアプローチでは、ここにリストされている<tx:jta-transaction-manager/>いくつかのデフォルトの場所でトランザクション マネージャーを探します。JBoss トランザクション マネージャーがこれらの場所のいずれにもない場合は、可能であれば移動するか、Tomcat に移動して、両方のコンテナーの TM が同じ JNDI の場所にあるようにすることをお勧めします。

于 2008-11-04T19:40:26.940 に答える
2

Spring 2.5 を使用している場合は、<tx:jta-transaction-manager/> を使用できます。JBoss で使用したことはありませんが、Spring リファレンス マニュアルのセクション9.8 アプリケーション サーバー固有の統合に従って動作するはずです。

于 2008-09-22T22:08:31.127 に答える
1

ここに私の経験を追加するだけなので、再び経験に苦しむ必要はありません。

bmatthews68、Chochos、およびこれらのポスターが言ったよう<tx:jta-transaction-manager/>に、Spring Bean ファイルで使用します。それは確実に適切なレベルの抽象化を提供し、Spring 側で余分なことをする必要はありません。

Tomcat に関して<Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" />は、デフォルト/共有conf/context.xmlファイルで宣言しました。これは にバインドされjava:comp/UserTransactionます。これは Spring によって検索される場所の 1 つであるため、他に何もする必要はありません。

ただし、私のように Maven を使用している場合は、javax.transaction:jtajar への依存関係を除外するか、スコープを に設定してprovidedください。そうしないと、クラスローダーの問題が発生します。

于 2011-02-22T16:16:50.133 に答える