سؤال

لدي تطبيق ويب يستخدم JPA وJTA مع Spring.أرغب في دعم كل من JBoss وTomcat.عند التشغيل على JBoss، أرغب في استخدام TransactionManager الخاص بـ JBoss، وعند التشغيل على Tomcat، أرغب في استخدام JOTM.

لدي كلا السيناريوهين يعملان، لكنني أجد الآن أنني بحاجة إلى تكوينين منفصلين لفصل الربيع في الحالتين.مع JOTM، أحتاج إلى استخدام Spring's 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 - دون الحاجة إلى ملفي تكوين مختلفين؟

هل كانت مفيدة؟

المحلول

أعتقد أنك فاتتك نقطة JNDI.تمت كتابة JNDI إلى حد كبير لحل المشكلة التي تواجهها!

أعتقد أنه يمكنك الارتقاء بالأمر إلى مستوى أعلى، لذا بدلاً من استخدام "userTransaction" أو "transactionManager من JNDI" اعتمادًا على موقفك.لماذا لا تضيف "JtaTransactionManager" إلى JNDI.بهذه الطريقة تقوم بدفع التكوين إلى JNDI حيث من المفترض أن يكون بدلاً من إنشاء المزيد من ملفات التكوين [مثل أنه لا يوجد ما يكفي بالفعل؛)].

نصائح أخرى

يمكنك استخدام 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 كخاصية النظام

هذا هو أحد النهج الممكنة.انظر بلدي مدونة للحصول على مثال أكثر اكتمالا.

أتمنى أن يساعدك هذا.

إذا كنت تستخدم Spring 2.5، فيمكنك استخدام <tx:jta-transaction-manager/>.لم أستخدمه مع JBoss ولكن يجب أن يعمل معك وفقًا للقسم 9.8 التكامل الخاص بخادم التطبيق من دليل الربيع المرجعي.

ال <tx:jta-transaction-manager/> سيبحث النهج عن مدير المعاملات في عدة مواقع افتراضية المدرجة هنا.إذا لم يكن مدير معاملات JBoss الخاص بك موجودًا في أحد هذه المواقع، أقترح عليك نقله، إن أمكن، أو نقله في Tomcat بحيث يكون لكلتا الحاويتين ذاكرة الترجمة الخاصة بهما في نفس موقع JNDI.

فقط أضيف تجربتي هنا حتى لا أضطر إلى إعادة تجربة التجربة مرة أخرى.

كما bmatthews68، تشوتشوس و هذه الملصقات لقد قال، استخدم <tx:jta-transaction-manager/> في ملف حبة الربيع الخاص بك؛إنه بالتأكيد يوفر المستوى المناسب من التجريد وليس هناك حاجة لفعل أي شيء إضافي على الجانب الربيعي.

أما بالنسبة لـ Tomcat، فقد أعلنت <Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" /> في الافتراضي/المشترك conf/context.xml الملف الذي يرتبط ب java:comp/UserTransaction.نظرًا لأن هذا هو أحد الأماكن التي تم البحث عنها بحلول فصل الربيع، فلن تحتاج إلى القيام بأي شيء آخر.

مسكتك واحدة رغم ذلك:إذا كنت تستخدم Maven مثلي، فتأكد من استبعاد أي تبعيات على ملف javax.transaction:jta jar أو اضبط النطاق على provided.وإلا فسوف تواجه مشكلات في أداة تحميل الفصل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top