2008-10-06 22 views
5

ऐसा प्रतीत होता है कि क्वार्ट्ज - जेडीबीसी जोबस्टोर का उपयोग करने के हमारे कार्यान्वयन स्प्रिंग, हाइबरनेट और वेबस्पेयर के साथ अप्रबंधित धागे फेंक रहे हैं।अप्रबंधित थ्रेड स्प्रिंग क्वार्ट्ज वेबस्पेयर हाइबरनेट

मैंने कुछ पढ़ा है और आईबीएम से एक तकनीकी लेख पाया है जिसमें कहा गया है कि वसंत के साथ क्वार्ट्ज का उपयोग उस कारण होगा। वे इस मुद्दे को हल करने के लिए CommnonJ का उपयोग करने का सुझाव देते हैं।

मैंने कुछ और शोध किया है और मैंने अभी तक देखा है कि एकमात्र उदाहरण पुराने जॉबस्टोर योजना के साथ सौदा करता है जो डेटाबेस में नहीं है।

तो, मैं सोच रहा था कि किसी के पास इस मुद्दे के समाधान का उदाहरण है या नहीं।

धन्यवाद

+0

"अप्रबंधित धागे फेंकने" का क्या मतलब है? –

+0

यह मेरी डब्ल्यूएएस टीम द्वारा मुझे बताया गया था कि जब हमारा आवेदन चल रहा है वहां एक धागे वाले राज्य में धागे पैदा होते हैं - जो कि किसी भी चीज़ से जुड़ा नहीं है, जीसी उन्हें नहीं मिल सकता है। आईबीएम वेबसाइट से पढ़ने के आधार पर, यह क्वार्ट्ज का उपयोग करते समय हो सकता है। – boyd4715

उत्तर

10

हमारे पास इस (दो वास्तव में) के लिए एक समाधान समाधान है।

1) मुख्य शेड्यूलर थ्रेड के लिए वर्कमैनेजर डिमन थ्रेड का उपयोग करने के लिए क्वार्ट्ज स्रोत कोड को बदलें। यह काम करता है, लेकिन क्वार्ट्स बदलने की आवश्यकता है। हमने इसका उपयोग नहीं किया, हालांकि हम क्वार्ट्ज के एक हैक किए गए संस्करण को बनाए रखना नहीं चाहते थे। (यह मुझे याद दिलाता है, मैं इसे प्रोजेक्ट में सबमिट करने जा रहा था लेकिन पूरी तरह से भूल गया था)

2) क्वार्ट्ज थ्रेडपूल के रूप में उपयोग करने के लिए वर्कमैनेजर थ्रेडपूल बनाएं। क्वार्ट्ज थ्रेडपूल के लिए इंटरफ़ेस को कार्यान्वित करें, ताकि प्रत्येक कार्य जो क्वार्ट्ज के भीतर ट्रिगर किया गया हो, एक सामान्य कार्य ऑब्जेक्ट में लपेटा गया है जिसे वर्कमैनेजर में निर्धारित किया जाएगा। कुंजी यह है कि वर्कमैनेजर थ्रेडपूल में वर्कमैनेजर को जावा ईई थ्रेड (जैसे सर्वलेट प्रारंभिकरण) से शेड्यूलर शुरू होने से पहले प्रारंभ करना होगा। WorkManagerTreadPool को फिर एक डिमन थ्रेड बनाना होगा जो नए कार्य ऑब्जेक्ट्स को बनाकर और शेड्यूल करके सभी शेड्यूल किए गए कार्यों को संभालेगा। इस तरह, शेड्यूलर (अपने धागे पर) कार्यों को एक प्रबंधित थ्रेड (कार्य डिमन) में गुजर रहा है।

आसान नहीं है, और दुर्भाग्य से मेरे पास कोड शामिल करने के लिए आसानी से उपलब्ध नहीं है।

+1

मुझे एहसास है कि यह पोस्ट पुराना है, लेकिन क्या आपके पास एक उदाहरण है कि आप वर्कमैनेजर डिमन थ्रेड का उपयोग करने के लिए क्वार्ट्ज को कैसे बदल सकते हैं या वर्कमैनेजर थ्रेडपूल बना सकते हैं जिसे क्वार्ट्ज थ्रेडपूल के रूप में उपयोग किया जा सकता है? मैं वेबस्पेयर के साथ क्वार्ट्ज का उपयोग करना चाहता हूं लेकिन अप्रबंधित धागे की सीमाओं का एहसास करना चाहता हूं, और इसे "सही तरीका" करना चाहता हूं। धन्यवाद। – user172092

3

चेक इस अनुच्छेद: http://www.ibm.com/developerworks/websphere/techjournal/0609_alcott/0609_alcott.html

मूल रूप से, taskExecutor संपत्ति SchedulerFactoryBean पर एक org.springframework.scheduling.commonj.WorkManager TaskExecutor जो कंटेनर में कामयाब धागे का उपयोग करेगा उपयोग करने के लिए निर्धारित किया है।

+0

इस समाधान ने हमें कार्यान्वित करने में 2 मिनट लग गए (आप WAS से डिफ़ॉल्ट WM jndi का पुन: उपयोग कर सकते हैं) और पूरी तरह से काम करता है। –

1

आप इसके बारे में क्वार्ट्ज पर उठाए गए नीचे दिए गए जिरा लिंक को देख सकते हैं।

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

यह आवश्यक WebSphereThreadPool कार्यान्वयन जो के रूप में अपनी आवश्यकताओं को पूरा करने के लिए उल्लेख किया quartz.properties में परिवर्तन के साथ इस्तेमाल किया जा सकता है। उम्मीद है की यह मदद करेगा।

सादर, शिव

1

आप websphere के प्रबंधित धागा पूल का उपयोग करना होगा। आप वसंत और आमज के माध्यम से ऐसा कर सकते हैं। कॉमनजे में एक कार्य निष्पादक हो सकता है जो प्रबंधित धागे बनाएगा। आप एक jndi प्रबंधित थ्रेड संसाधन के संदर्भ का भी उपयोग कर सकते हैं। फिर आप स्प्रिंग आधारित क्वार्ट्ज शेड्यूलर फैक्ट्रीबीन में कॉमन कार्य निष्पादक को इंजेक्ट कर सकते हैं।

कृपया http://open.bekk.no/boss/spring-scheduling-in-websphere/ देखें और अधिक जानकारी के लिए "कॉमनजे के साथ क्वार्ट्ज" अनुभाग पर जाएं।

5

धागा करने के लिए एक और उत्तर जोड़ा जा रहा है, के बाद से मैं इस के लिए एक समाधान पाया: यह नया मुद्दा (एक नई Jira में) समस्या को संबोधित किया जा रहा है आखिरकार।

मेरा पर्यावरण: WAS 8.5.5, क्वार्ट्ज 1.8.5, कोई वसंत नहीं।

समस्या मैं (ऊपर कहा गया है) किया गया था अप्रबंधित धागा ctx.lookup(myJndiUrl) से एक NamingException के कारण, कि बजाय सही ढंग से अन्य अनुप्रयोग सर्वर (JBoss, Weblogic) में काम कर रहा था; वास्तव में, Webpshere निम्न संदेश के साथ एक "घटना" फायरिंग की गई थी:

javax.naming.ConfigurationException: एक JNDI आपरेशन एक पर "जावा:" नाम पूरा नहीं किया जा सकता क्योंकि सर्वर क्रम संबद्ध नहीं है किसी भी जे 2 ईई अनुप्रयोग घटक के साथ ऑपरेशन का धागा। यह स्थिति तब हो सकती है जब "java:" नाम का उपयोग करने वाले JNDI क्लाइंट को सर्वर अनुप्रयोग अनुरोध के थ्रेड पर निष्पादित नहीं किया जाता है। सुनिश्चित करें कि एक जे 2 ईई अनुप्रयोग स्थिर कोड ब्लॉक के भीतर या j2EE अनुप्रयोग द्वारा बनाए गए धागे में "जावा:" नामों पर जेएनडीआई संचालन निष्पादित नहीं करता है। ऐसा कोड जरूरी नहीं है कि सर्वर अनुप्रयोग अनुरोध के धागे पर चलें और इसलिए "java:" नामों पर जेएनडीआई संचालन द्वारा समर्थित नहीं है।

निम्न चरणों को समस्या हल:

1) 1.8.6 (कोई कोड में परिवर्तन क्वार्ट्ज अपग्रेड किया गया), बस Maven पोम

2) के लिए निम्न डीईपी जोड़ा क्लासपाथ (मेरे मामले में, ईएआर/lib फ़ोल्डर), नया वर्कमैनेजर थ्रेडएक्सएटर उपलब्ध कराने के लिए

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

नोट: QTZ-113 या आधिकारिक क्वार्ट्ज दस्तावेज़ीकरण 1.x2.x इस फ़िक्स को सक्रिय करने के तरीके पर कोई उल्लेख नहीं है। > AsynchronousBeans - - सांत्वना था में> WorkManagers)

3) quartz.properties करने के लिए "wm/डिफ़ॉल्ट" मेरा था 8.5.5 में पहले से ही कॉन्फ़िगर DefaultWorkManager की JNDI निम्नलिखित (किया गया था, संसाधन देखने के लिए जोड़ा :

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

नोट: सही वर्ग org.quartz है। कस्टम.WorkManagerThreadExecutor क्वार्ट्ज-शेड्यूलर-1.8.6 (परीक्षण), या org.quartz के लिए। आमज। वर्कमैनेजर थ्रेडएक्सएटर2.1 से।1 पर (परीक्षण नहीं किया है, लेकिन Maven के रेपोस पर वास्तविक quartz-commonj's jars भीतर सत्यापित)

4) क्वार्ट्ज काम के खाली निर्माता में JNDI देखने चले गए (m_klovre's "Thread outside of the J2EE container" करने के लिए धन्यवाद); अर्थात, कन्स्ट्रक्टर को मेरे आवेदन के समान जे 2 ईई संदर्भ से प्रतिबिंब (newInstance() विधि) द्वारा बुलाया जा रहा था, और java:global नामस्थान तक पहुंच थी, जबकि execute(JobExecutionContext) विधि अभी भी एक गरीब संदर्भ में चल रही थी, जिसमें मेरे सभी एप्लिकेशन गायब थे ईजेबी

उम्मीद है कि इससे मदद मिलती है।

Ps। एक संदर्भ के रूप में, आप here को quartz.properties फ़ाइल का एक उदाहरण देख सकते हैं I

+0

मुझे पता है कि वर्षों रहे हैं, लेकिन क्या आपको मौका है कि आप quartz.properties फ़ाइल की पूरी सामग्री को ढूंढ और साझा कर सकते हैं? – rodripf

+1

निश्चित रूप से, यह है - उम्मीद है कि मदद करता है। इसके अलावा, अगर आप इसे उपयोगी पाते हैं तो कृपया मेरे उत्तर को ऊपर उठाएं। – PaoloC

+0

धन्यवाद! लेकिन मैं समस्या से जूझ रहा हूं। मेरे पर्यावरण में जो अंतर मिला है वह क्वार्ट्ज 2.2 है।मुझे यकीन नहीं है कि अगर मुझे कोई अग्रिम मिल जाए तो मुझे और क्या कहना चाहिए। – rodripf

1

WAS85 ans क्वार्ट्ज 1.8.6 के लिए पाओलोसी का प्रस्ताव WAS80 (और क्वार्ट्ज 1.8.6) पर भी काम करता है और इसकी आवश्यकता नहीं है वसंत। (मेरे सेटअप में वसंत 2.5.5 मौजूद है, लेकिन उस संदर्भ में उपयोग में नहीं है।)

इस तरह से मैं इंजेक्शनहेल्पर का उपयोग करके अपने नए संस्करण द्वारा सरल जेबफैक्टरी को ओवरराइड करने में सक्षम था, प्रत्येक नव निर्मित नौकरी पर सीडीआई लागू करने के लिए। इंजेक्शन @EJB दोनों के लिए काम करता है (एनएनबी रिमोट बिजनेस इंटरफेस के जेएनडीआई लुकअप के साथ) और @ इंजेक्ट (सीडीआई बीनमैनेजर के जेएनडीआई लुकअप के साथ पहले एक नया इनिशियल कॉन्टेक्स्ट का उपयोग करके, और उसके बाद सीडीआई बीन को देखने के लिए इस नए fetched BM का उपयोग करके)।

उस उत्तर के लिए पाओलोसी धन्यवाद! (मुझे आशा है कि यह टेक्स्ट "पाओलोसी का जवाब" के रूप में दिखाई देगा, न कि मुख्य विषय के उत्तर के रूप में। इनके बीच अंतर करने का कोई तरीका नहीं मिला।)

0

मुझे हाल ही में इस समस्या का सामना करना पड़ा है। व्यावहारिक रूप से आपको इसकी आवश्यकता है:

  1. वेबस्पेयर कार्य प्रबंधक को काम सौंपकर थ्रेड पूल लागू करें। (क्वार्ट्ज केवल SimpleThreadPool प्रदान करता है जो अप्रबंधित धागे पर नौकरियां चलाता है)। क्वार्ट्ज बताओ WorkManagerThreadExecutor उपयोग करने के लिए
  2. टेल क्वार्ट्ज org.quartz.threadPool.class संपत्ति द्वारा इस थ्रेड पूल का उपयोग करने (या कस्टम एक को लागू) org.quartz.threadExecutor.class संपत्ति द्वारा
  3. जटिल पुरानी वेब कंटेनर :)

यहाँ की github demo है के साथ एक सा धैर्य वेबस्पेयर (और टोमकैट) के साथ क्वार्ट्ज का उपयोग करना।

उम्मीद है कि यह किसी की मदद करता है ..

संबंधित मुद्दे