2011-03-23 6 views
5

में तैनात है, मैं टॉमकैट में तैनात एक वेब एप्लिकेशन पर काम कर रहा हूं। हम ग्राहक पक्ष में वसंत, हाइबरनेट, जीडब्ल्यूटी का उपयोग कर रहे हैं)।थ्रेड को एक वेबप्लिकेशंस बनाना जो कि टॉमकैट

इस एप्लिकेशन की कार्यक्षमता में से कोई भी उपयोगकर्ता को अलर्ट (ईमेल) भेजना है जब किसी भी इकाई को बनाया, अद्यतन या हटा दिया जाता है। (उपयोगकर्ताओं द्वारा फ्लाई पर अलर्ट जोड़े जा सकते हैं, इसलिए इसमें कुछ प्रसंस्करण शामिल है - यह तय करने के लिए कि कौन से उपयोगकर्ताओं को ईमेल द्वारा अधिसूचित किया जाना चाहिए)।

अलर्ट तंत्र आदर्श रूप से असीमित होना चाहिए और इसे सीआरयूडी ऑपरेशन के प्रदर्शन को प्रभावित करना चाहिए।

पहली बात जो मेरे दिमाग में आई थी वह धागा बनाना और अवरुद्ध कतार है। थ्रेड मतदान को रोकने के लिए कतार को रोकता रहता है यह देखने के लिए कि क्या इसमें कोई घटना है या नहीं। लेकिन वेब अनुप्रयोग में धागा बनाना कुछ ऐसा है जो कई कंटेनरों द्वारा निराश होता है।

क्या कोई सलाह/सुझाव दे सकता है - क्या यह करने का यह सही तरीका है? या एक ही काम करने के बेहतर तरीके हैं।

किसी भी पॉइंटर्स की अत्यधिक सराहना की जाएगी।

अग्रिम धन्यवाद, सचिन

+0

बस डॉन अपने थ्रेड को डेमॉन थ्रेड के रूप में चिह्नित करना न भूलें, इसलिए वे टॉमकैट को साफ से बंद करने से नहीं रोकते हैं। आपके त्वरित उत्तर के लिए – Daniel

उत्तर

7

एक कंटेनर में धागे बनाने पर प्रतिबंध वास्तव में अनुभवहीन डेवलपर्स को पैर में खुद को शूटिंग से रखने का सुझाव था। कोई कंटेनर वास्तव में आपको ऐसा करने से रोकता है। Java.util.concurrent कक्षाओं के साथ, थ्रेड बनाना कम त्रुटि प्रवण होना चाहिए और मैं इस प्रतिबंध के बारे में ज्यादा चिंता नहीं करता।

यदि आपकी आवश्यकताएं सरल हैं, तो बस ServletContextListener में एक थ्रेड/रननेबल बनाने के लिए पर्याप्त आसान है। contextInitialized() में थ्रेड बनाएं और शुरू करें और contextDestroyed() में इसे बंद करें। । Executors.newSingleThreadScheduledExecutor() द्वारा बनाए गए ScheduledExecutorService का उपयोग करें। आप निष्पादक के पास जाने योग्य रनिंग योग्य ब्लॉकिंगक्यूयू से पढ़ेंगे।

यदि आपकी आवश्यकताएं बदलती हैं और आपको कुछ और जटिल की आवश्यकता है, तो आप शायद जेएमएस/एमडीबी या क्वार्ट्ज जैसे शेड्यूलर को देखना चाहते हैं।

+0

आपके उत्तर के लिए धन्यवाद .. – Sachin

+1

यह अनुभवहीन डेवलपर्स के लिए सिर्फ एक सुझाव नहीं है। मुद्दा संसाधनों के प्रबंधन के लिए डिज़ाइन किए गए पर्यावरण के अंदर अप्रबंधित संसाधनों के उपयोग को हतोत्साहित करना है। इसे वेब कंटेनर में अनुमति है, लेकिन प्रबंधित थ्रेड प्रदान करने के तरीके हैं जो इस माहौल में बेहतर काम करेंगे। एक साइड नोट के रूप में, ईजेबी कंटेनर इसे अनुमति भी नहीं देता है। – Robin

+0

कृपया यह उदाहरण देखें: http://java-by-ash.blogspot.com/2012/07/threads-in-java-web-application.html – ThreaT

1

आप जॉब नियमित रूप से चलाने के लिए या संदेश प्रेरित सेम (some documentation on JMS and Spring) जो कंटेनर जो आप के लिए कतार मतदान करता द्वारा क्रियान्वित कर रहे के वसंत बराबर उपयोग करने के लिए एक अनुसूचक इस्तेमाल कर सकते हैं।

+0

धन्यवाद थॉमस।हम एओपी का उपयोग करने और सफलतापूर्वक पूरा होने पर ArrayBlockingQueue में सभी सेवा स्तर सीआरयूडी कॉल और अपडेट को रोकने में सोच रहे हैं। यदि मैं शेड्यूलर का उपयोग करता हूं, तो पहलू कैसे सभी सेवा स्तर सीआरयूडी कॉल को इंटरप्ट करता है शेड्यूलर को सूचित करता है? और क्या आप कृपया एमडीबी के वसंत समकक्ष पर कुछ और विवरण (लिंक, आदि) प्रदान कर सकते हैं। धन्यवाद एक बार फिर – Sachin

+0

ठीक है, मैंने पहले से ही एक लिंक जोड़ा है, क्या आपने इसे देखा है? शेड्यूलर के लिए, इसे नियमित रूप से चलाना चाहिए (1 मिनट अंतराल में या तो), लंबित अलर्ट की जांच करें और उन्हें भेजें। ऐसा एक शेड्यूलर [क्वार्ट्ज] होगा (http://www.quartz-scheduler.org/)। – Thomas

+0

धन्यवाद थॉमन एक टन। वास्तव में अपने उत्तर की सराहना करते हैं ... – Sachin

0

ऐसा करने के तरीके हैं, सबसे आसान (केवल एक अप्रबंधित धागा बनाने के अलावा) commonj WorkManager का उपयोग करना है। निश्चित रूप से आप सरल थ्रेड मार्ग पर जा सकते हैं, लेकिन इसमें आपके द्वारा संचालित वातावरण में कमियां होती हैं (जैसा कि लिंक में वर्णित है)।

1

आप वसंत 3.x एसिंक्रोनस विधि आमंत्रण का उपयोग करने का प्रयास कर सकते हैं। कोलर विधि तुरंत वापस आ जाएगी और वास्तविक निष्पादन एसिंक्रोनस रूप

applicationContext होता है:

<task:annotation-driven executor="asyncExecutor" mode="aspectj"/> 
<task:executor id="asyncExecutor" pool-size="${executor.poolSize}"/> 

अपने सेम पर:

@Async 
public void sendEmail(...) { 
// ... 
} 

अधिक जानकारी के लिए स्प्रिंग दस्तावेज़ देखें: Spring 3.x Task Execution and Scheduling

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