سؤال

يبدو أن تطبيقنا لاستخدام Quartz - JDBCJobStore مع Spring وHbernate وWebsphere يؤدي إلى ظهور سلاسل محادثات غير مُدارة.

لقد قمت ببعض القراءة ووجدت مقالًا تقنيًا من شركة IBM ينص على أن استخدام الكوارتز مع Spring سيؤدي إلى ذلك.يقترحون استخدام CommnonJ لمعالجة هذه المشكلة.

لقد أجريت المزيد من البحث والأمثلة الوحيدة التي رأيتها حتى الآن تتعلق جميعها بخطة JobStore القديمة غير الموجودة في قاعدة البيانات.

لذلك، كنت أتساءل عما إذا كان أي شخص لديه مثال لحل هذه المشكلة.

شكرًا

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

المحلول

لدينا حل لهذا العمل (اثنان في الواقع).

1) تبديل شفرة المصدر الكوارتز لاستخدام موضوع الخفي WorkManager للموضوع جدولة الرئيسي. كان يعمل، ولكن يتطلب ليترات المتغيرة. لم نستخدم هذا على الرغم من أننا لم نكن نريد الحفاظ على النسخة التي تم الاستيلاء عليها من الكوارتز. (وهذا يذكرني، كنت ذاهبا لتقديم هذا المشروع ولكن نسيت تماما)

2) خلق WorkManagerThreadPool لاستخدامها في threadpool الكوارتز. تطبيق واجهة لThreadPool الكوارتز، بحيث يتم تغليف كل مهمة التي يتم تشغيلها داخل الكوارتز في كائن العمل commonj التي سيتم بعد ذلك المقرر في WorkManager. والمفتاح هو أن WorkManager في WorkManagerThreadPool لابد من تهيئة قبل بدء جدولة، من موضوع جاوة EE (مثل التهيئة بريمج). يجب على WorkManagerThreadPool قم بإنشاء موضوع الخفي الذي سوف التعامل مع جميع المهام المجدولة من خلال خلق وجدولة الكائنات عمل جديدة. بهذه الطريقة، وجدولة (في موضوع خاص بها) يمر المهام إلى موضوع تمكنت (شيطان العمل).

وليس بسيط، وللأسف ليس لدي كود متاحة بسهولة لتشمل.

نصائح أخرى

إضافة إجابة أخرى إلى الموضوع، حيث وجدت حلاً لهذا، أخيرًا.

بيئتي:كان 8.5.5، كوارتز 1.8.5، لا يوجد زنبرك.

المشكلة لقد كان الخيط غير المُدار (المذكور أعلاه) يسبب NamingException من ctx.lookup(myJndiUrl), ، كان يعمل بشكل صحيح في خوادم التطبيقات الأخرى (JBoss، Weblogic)؛في الواقع، كان Webpshere يطلق "حادثًا" بالرسالة التالية:

javax.naming.ConfigurationException:لا يمكن إكمال عملية JNDI على اسم "java:" لأن وقت تشغيل الخادم غير قادر على ربط مؤشر ترابط العملية بأي مكون تطبيق J2EE.يمكن أن تحدث هذه الحالة عندما لا يتم تنفيذ عميل JNDI الذي يستخدم اسم "java:" على مؤشر ترابط طلب تطبيق الخادم.تأكد من أن تطبيق J2EE لا ينفذ عمليات JNDI على أسماء "java:" داخل كتل التعليمات البرمجية الثابتة أو في سلاسل الرسائل التي تم إنشاؤها بواسطة تطبيق J2EE هذا.لا يتم تشغيل هذا الرمز بالضرورة على مؤشر ترابط طلب تطبيق الخادم، وبالتالي لا يتم دعمه بواسطة عمليات JNDI على أسماء "java:".

الخطوات التالية حلت المشكلة:

1) تمت الترقية إلى Quartz 1.8.6 (بدون تغييرات في التعليمات البرمجية)، فقط maven pom

2) تمت إضافة القسم التالي إلى classpath (في حالتي، المجلد /lib الخاص بـ EAR)، لإتاحة WorkManagerThreadExecutor الجديد

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz-commonj</artifactId>
  <version>1.8.6</version>
</dependency>

ملحوظة:في كيو تي زي-113 أو وثائق الكوارتز الرسمية 1.x 2.x لا يوجد ذكر لكيفية تفعيل هذا الإصلاح.

3) تمت إضافة ما يلي إلى quartz.properties ("wm/default" كان JNDI الخاص بـ DefaultWorkManager الذي تم تكوينه بالفعل في WAS 8.5.5، راجع الموارد -> الفاصوليا غير المتزامنة -> مديرو العمل في وحدة التحكم WAS):

org.quartz.threadExecutor.class=org.quartz.custom.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default

ملحوظة:الطبقة الصحيحة هي org.quartz.مخصص.WorkManagerThreadExecutor لجدولة الكوارتز 1.8.6 (تم اختبارها)، أو org.quartz.com.commonj.WorkManagerThreadExecutor من 2.1.1 on (لم يتم اختباره، ولكن تم التحقق منه ضمن النطاق الفعلي الجرار الكوارتز المشتركة على اتفاقات مخضرم)

4) انتقل بحث JNDI في المُنشئ الفارغ لوظيفة الكوارتز (بفضل m_klovre "موضوع خارج حاوية J2EE");وهذا يعني أنه تم استدعاء المُنشئ عن طريق الانعكاس (newInstance() الطريقة) من نفس سياق J2EE لطلبي، وكان بإمكاني الوصول إليه java:global مساحة الاسم، بينما execute(JobExecutionContext) كانت الطريقة لا تزال تعمل في سياق فقير، مما أدى إلى فقدان كافة وحدات JB الخاصة بتطبيقي

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

ملاحظة.كمرجع، يمكنك أن تجد هنا مثال على ملف quartz.properties الذي كنت أستخدمه أعلاه

وتحقق هذا المقال: http://www.ibm.com/developerworks/websphere/techjournal/ 0609_alcott / 0609_alcott.html

وأساسا، تعيين الخاصية taskExecutor على SchedulerFactoryBean لاستخدام org.springframework.scheduling.commonj.WorkManager TaskExecutor التي سوف تستخدم الحاويات المواضيع المدارة.

ومجرد ملاحظة: الرابط الكوارتز-708 في أعلاه غير صحيح بعد الآن. هذا العدد الجديد (في جيرة جديد) <م> يبدو إلى أن معالجة المشكلة: <لأ href = "http://jira.terracotta.org/jira/browse/QTZ-113" يختلط = "نوفولو "> http://jira.terracotta.org/jira/browse/QTZ-113 (وfixVersion = 1.8.6، 2.0.2)

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

http://jira.opensymphony.com/browse/QUARTZ-708

وهذا له تنفيذ WebSphereThreadPool المطلوب والتي يمكن استخدامها مع التغييرات في quartz.properties على النحو المذكور لتلبية الاحتياجات الخاصة بك. ويساعد هذا الأمل.

والتحيات، سيفا

وسيكون لديك لاستخدام حمامات موضوع نجح بنك الإسكان للتجارة و. يمكنك القيام بذلك عن طريق الربيع وcommonj. CommonJ يمكن له منفذ المهمة التي من شأنها خلق المواضيع إدارتها. يمكنك حتى استخدام إشارة إلى JNDI تمكن الموارد الموضوع. يمكنك بعد ذلك حقن مهمة المنفذ commonj في الربيع على أساس الكوارتز SchedulerFactoryBean.

http://open.bekk.no/boss/spring -scheduling في وبنك الإسكان للتجارة / ثم انتقل إلى قسم "الكوارتز مع CommonJ" لمزيد من التفاصيل.

وهذا الاقتراح من PaoloC لWAS85 الجواب الكوارتز 1.8.6 يعمل أيضا على WAS80 (والكوارتز 1.8.6) ولا يحتاج إلى الربيع. (في بلدي الربيع الإعداد 2.5.5 موجود، ولكن لا تكون قيد الاستعمال في هذا السياق.)

وبهذه الطريقة تمكنت من تجاوز SimpleJobFactory بلدي البديل الخاص، وذلك باستخدام InjectionHelper لتطبيق CDI على كل وظيفة تم إنشاؤه حديثا. حقن يعمل لكلاEJB (مع بحث JNDI واجهة العمل عن بعد EJB المشروح) وInject (مع JNDI بحث من CDI BeanManager يستخدم InitialContext الجديد أولا، ثم تستخدم هذه BM المنال حديثا لبحث الفاصوليا CDI نفسه).

وشكرا PaoloC لهذا الجواب! (آمل أن يكون هذا النص يظهر على أنه "الجواب على PaoloC" وليس جوابا على الموضوع الرئيسي. العثور على أي وسيلة للتمييز بين هذين).

لقد واجهت هذه المشكلة مؤخرا.عمليا تحتاج:

  1. قم بتنفيذ تجمع مؤشرات الترابط عن طريق تفويض العمل إلى Websphere Work Manager.(يوفر Quartz SimpleThreadPool فقط الذي يقوم بتشغيل المهام على سلاسل الرسائل غير المُدارة).أخبر الكوارتز باستخدام مجموعة الخيوط هذه org.quartz.threadPool.class ملكية
  2. اطلب من الكوارتز أن يستخدم WorkManagerThreadExecutor (أو تنفيذ واحد مخصص) بواسطة org.quartz.threadExecutor.class ملكية
  3. قليل من الصبر مع حاويات الويب القديمة المرهقة :)

هنا عرض جيثب لاستخدام الكوارتز مع Websphere (وأيضًا Tomcat).

نأمل أن يساعد شخص ما..

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