2008-09-22 25 views
10

Tôi có một ứng dụng web sử dụng JPA và JTA với Spring. Tôi muốn hỗ trợ cả JBoss và Tomcat. Khi chạy trên JBoss, tôi muốn sử dụng JBMan's TransactionManager, và khi chạy trên Tomcat, tôi muốn sử dụng JOTM.Cấu hình Spring JTA TransactionManager: Hỗ trợ cả Tomcat và JBoss

Tôi có cả hai tình huống làm việc, nhưng bây giờ tôi thấy rằng tôi dường như cần hai cấu hình Spring riêng biệt cho hai trường hợp. Với JOTM, tôi cần phải sử dụng Spring JotmFactoryBean:

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

Trong JBoss, tuy nhiên, tôi chỉ cần lấy "TransactionManager" từ 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> 

Có cách nào để cấu hình này để các TransactionManager thích hợp - JBoss hoặc JOTM - được sử dụng, không cần hai tệp cấu hình khác nhau?

+0

Mùa xuân 3 không còn cung cấp lớp 'org.springframework.transaction.jta.JotmFactoryBean', vì vậy bạn có thể cần phải sao chép nguồn từ 2.5.x. – Jason

Trả lời

14

Tôi nghĩ bạn đã bỏ lỡ điểm của JNDI. JNDI đã được viết khá nhiều để giải quyết vấn đề bạn có!

Tôi nghĩ bạn có thể nâng cấp lên, vì vậy thay vì sử dụng "userTransaction" hoặc "transactionManager từ JNDI" tùy thuộc vào tình huống của bạn. Tại sao không thêm "JtaTransactionManager" vào JNDI. Bằng cách đó bạn đẩy cấu hình đến JNDI, nơi nó được cho là thay vì tạo ra các tập tin cấu hình hơn nữa [như chưa có đủ;)].

4

Bạn có thể sử dụng PropertyConfigurerPlaceholder để chèn các tham chiếu bean cũng như các giá trị đơn giản.

Ví dụ nếu bạn gọi đậu của bạn 'JOTM' và 'JBoss' sau đó bạn có thể tiêm TM của bạn như:

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

Sau đó, bạn có thể trao đổi các nhà quản lý giao dịch sử dụng

  • transaction.strategy = jotm trong tệp thuộc tính
  • -Dtransaction.strategy = jotm làm thuộc tính hệ thống

Đây là một cách tiếp cận khả thi. Xem blog của tôi để biết ví dụ hoàn chỉnh hơn.

Hy vọng điều này sẽ hữu ích.

2

Nếu bạn đang sử dụng Spring 2.5, bạn có thể sử dụng < tx: jta-transaction-manager/>. Tôi đã không sử dụng nó với JBoss nhưng nó sẽ làm việc cho bạn theo phần 9.8 Application server-specific integration từ hướng dẫn tham khảo mùa xuân.

2

Cách tiếp cận <tx:jta-transaction-manager/> sẽ tìm người quản lý giao dịch ở một số vị trí mặc định listed here. Nếu người quản lý giao dịch JBoss của bạn không ở trong một trong những vị trí đó, tôi đề nghị bạn di chuyển nó, nếu có thể, hoặc di chuyển nó trong Tomcat để cả hai thùng chứa TM của chúng ở cùng một vị trí JNDI.

1

Chỉ cần thêm kinh nghiệm của tôi ở đây để tôi không phải chịu đựng lại trải nghiệm.

Vì bmatthews68, Chochos và these posters đã cho biết, hãy sử dụng <tx:jta-transaction-manager/> trong tệp bean Spring của bạn; nó chắc chắn cung cấp mức trừu tượng thích hợp và không cần phải làm gì thêm ở phía bên Xuân.

Đối với Tomcat, tôi đã khai báo <Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" /> trong tệp tin mặc định/được chia sẻ conf/context.xml, liên kết với java:comp/UserTransaction. Vì đây là một trong những nơi được tìm kiếm bởi mùa xuân, bạn không cần phải làm bất cứ điều gì khác.

Một lưu ý mặc dù: nếu như tôi bạn sử dụng Maven, hãy đảm bảo bạn loại trừ bất kỳ phụ thuộc nào vào bình javax.transaction:jta hoặc đặt phạm vi thành provided. Nếu không, bạn sẽ gặp phải các vấn đề về trình nạp lớp.

Các vấn đề liên quan