質問

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) が使用されるようにこれを設定する方法はありますか?

役に立ちましたか?

解決

JNDI の要点を見逃しているようです。JNDI は、ほぼあなたが抱えている問題を解決するために書かれたものです。

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

他のヒント

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>

次に、次を使用してトランザクション マネージャーを交換できます。

  • トランザクション.戦略=jotm プロパティファイル内で
  • -Dtransaction.strategy=jotm システムプロパティとして

これは考えられるアプローチの 1 つです。私のことを見てください ブログ より完全な例については、

お役に立てれば。

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

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

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

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 つであるため、他に何もする必要はありません。

ただし、注意点が 1 つあります。私と同じように Maven を使用している場合は、Maven への依存関係を必ず除外してください。 javax.transaction:jta jar を使用するか、スコープを次のように設定します provided. 。そうしないと、クラスローダーの問題が発生します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top