2008-09-22 2 views
10

У меня есть веб-приложение, использующее JPA и JTA с Spring. Я хотел бы поддержать JBoss и Tomcat. Когда я работаю на JBoss, я бы хотел использовать собственный TransactionManager JBoss, и, работая на Tomcat, я хотел бы использовать JOTM.Spring JTA TransactionManager config: Поддержка как Tomcat, так и JBoss

У меня есть оба сценария работы, но теперь я обнаружил, что мне, кажется, нужны две отдельные конфигурации 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, хотя, я просто нужно получить «TransactionManager» из 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> 

Есть ли способ настроить это так, чтобы соответствующий TransactionManager - JBoss или JOTM - используется без необходимости в двух разных файлах конфигурации?

+0

Spring 3 больше не предоставляет класс `org.springframework.transaction.jta.JotmFactoryBean`, поэтому вам может потребоваться скопировать источник из 2.5.x. – Jason 2014-01-08 01:13:26

ответ

14

Я думаю, что вы пропустили точку JNDI. JNDI был в значительной степени написан для решения вашей проблемы!

Я думаю, вы можете взять его на уровень, поэтому вместо использования «userTransaction» или «transactionManager из JNDI» в зависимости от вашей ситуации. Почему бы не добавить «JtaTransactionManager» в JNDI. Таким образом, вы нажимаете конфигурацию на JNDI, где предполагается, что она будет создана вместо создания еще большего количества файлов конфигурации [вроде этого уже недостаточно;)].

4

Вы можете использовать PropertyConfigurerPlaceholder для ввода ссылок на бонусы, а также простых значений.

Например, если вы называете ФАСОЛЕЙ «jotm» и «JBoss», то вы можете придать вашей ТМ как:

<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 как системное свойство

Это один из возможных подходов. См. Мой blog для более полного примера.

Надеюсь, это поможет.

2

Если вы используете Spring 2.5, вы можете использовать < tx: jta-transaction-manager/>. Я не использовал его с JBoss, но он должен работать для вас в соответствии с разделом 9.8 Application server-specific integration из справочного руководства Spring.

2

Подход <tx:jta-transaction-manager/> будет искать менеджера транзакций в нескольких местах по умолчанию listed here. Если ваш менеджер транзакций JBoss не находится в одном из этих мест, я предлагаю вам переместить его, если это возможно, или перенести его в Tomcat, чтобы оба контейнера имели свой TM в том же местоположении JNDI.

1

Просто добавьте свой опыт здесь, чтобы не переусердствовать снова.

Как говорится в bmatthews68, Chochos и these posters, используйте <tx:jta-transaction-manager/> в вашем файле с фасолью весны; он определенно обеспечивает соответствующий уровень абстракции, и нет необходимости делать что-либо дополнительное на стороне Spring.

Что касается Tomcat, я объявил <Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" /> в файле default/shared conf/context.xml, который привязывается к java:comp/UserTransaction. Поскольку это одно из мест, которые искали весной, вам не нужно ничего делать.

Один из них: хотя, как и я, вы используете Maven, убедитесь, что вы исключаете любые зависимости от баночки или задаете область действия provided. В противном случае вы столкнетесь с проблемами загрузчика классов.

Смежные вопросы