Frage

Ich habe eine Web-Anwendung mit JPA und JTA mit Frühling. Ich möchte sowohl JBoss und Tomcat unterstützen. Wenn auf JBoss ausgeführt wird, würde Ich mag eigene Transaction JBoss verwenden, und wenn sie auf Tomcat läuft, würde Ich mag JOTM verwenden.

Ich habe beide Szenarien arbeiten, aber ich finde, dass ich jetzt scheinen zwei getrennte Federkonfigurationen für die beiden Fälle zu müssen. Mit JOTM, ich brauche Spring JotmFactoryBean zu verwenden:

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

In JBoss, aber ich brauche nur "Transaction" von JNDI zu holen:

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

Gibt es eine Möglichkeit, dies zu konfigurieren, so dass die entsprechende Transaction - JBoss oder JOTM - verwendet wird, ohne die Notwendigkeit für zwei verschiedene Konfigurationsdateien

War es hilfreich?

Lösung

Ich denke, man den Punkt der JNDI verpasst haben. JNDI war ziemlich viel geschrieben, das Problem zu lösen, die Sie haben!

Ich glaube, Sie es auf eine Stufe nehmen, so dass anstelle der „Usertransaction“ verwenden oder „transaction von JNDI“ je nach Ihrer Situation. Warum nicht die „JtaTransactionManager“ zu JNDI hinzufügen. So können Sie die Konfiguration in den JNDI schieben, wo es sein soll, anstatt noch mehr Konfigurationsdateien zu schaffen, [wie es nicht genug ist schon;)].

Andere Tipps

Sie können PropertyConfigurerPlaceholder verwenden, um Bohnen Verweise sowie einfache Werte zu injizieren.

Wenn Sie zum Beispiel Ihre Bohnen ‚JOTM‘ nennen und ‚Jboss‘ dann könnten Sie Ihre TM injizieren wie:

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

Dann können Sie Transaktionsmanager tauschen mit

  • transaction.strategy = JOTM in einer Eigenschaftendatei
  • -Dtransaction.strategy = JOTM als Systemeigenschaft

Dies ist ein möglicher Ansatz. Sehen Sie mein Blog für ein vollständigeres Beispiel rel="nofollow .

Hope, das hilft.

Wenn Sie Frühling verwenden 2.5 können Sie . Ich habe es nicht mit JBoss verwendet, aber es sollte gemäß Abschnitt für Sie arbeiten? 9.8 Applikationsserver spezifische Integration aus dem Frühjahr-Referenzhandbuch.

Der <tx:jta-transaction-manager/> Ansatz sucht nach einem Transaktionsmanager in mehreren Standardpositionen hier aufgeführten . Wenn Ihr JBoss Transaktions-Manager nicht in einem dieser Orte ist, schlage ich vor, Sie es, wenn möglich, oder es in Tomcat bewegen, so dass beide Behälter in der gleichen JNDI Lage ihre TM haben.

Hinzufügen nur meine Erfahrung hier also muss ich wieder die Erfahrung nicht wieder leiden.

Wie bmatthews68, Chochos und diese Plakate gesagt haben, verwenden <tx:jta-transaction-manager/> in Ihrer Spring-Bean-Datei; es bietet auf jeden Fall das richtige Maß an Abstraktion und es gibt keine Notwendigkeit, etwas Extra auf der Federseite zu tun.

Wie für Tomcat, erklärte ich <Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" /> im Standard / shared conf/context.xml-Datei, die an java:comp/UserTransaction bindet. Da dies einer der Orte, für von Spring gesucht ist, sollten Sie nichts anderes tun müssen.

Ein Gotcha obwohl: Wenn Sie wie ich Sie Maven verwenden, stellen Sie sicher ausschließen Sie alle Abhängigkeiten auf dem javax.transaction:jta jar oder den Bereich zu provided gesetzt. Andernfalls werden Sie Classloader Probleme auftreten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top