2013-07-28 8 views
26

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

क्या कोई इस बात का संकेत देता है कि यह क्यों हो रहा है? या इस समस्या के बारे में अधिक जानकारी कैसे प्राप्त करें?

क्या इस स्थिति को एप्लिकेशन के भीतर और शेड्यूलर को पुनरारंभ करने का कोई तरीका है?

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

+6

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

+0

@ निकोलस.hauschild यह एक बाहरी आरईएसटी webservice कहते हैं। तो आप कह रहे हैं कि ऐसा अनुरोध संभवतः ब्लॉक (डेडलॉक?) को अवरुद्ध कर सकता है और इसलिए अन्य सभी नौकरियों को रोक सकता है। मुझे लगता है कि अगर यह फिर से होता है तो मैं सर्वर के थ्रेड डंप का अनुरोध करूंगा। आपके सहयोग के लिए धन्यवाद। – obecker

+0

थ्रेड डंप लेना शायद एक अच्छा विचार होगा। –

उत्तर

3

यह पता लगाना बहुत आसान है। आप इसे एक स्टैक ट्रेस के साथ कर रहे होंगे। एक स्टैक ट्रेस कैसे प्राप्त करें, इस पर कई पोस्ट हैं, यूनिक्स सिस्टम पर आप 'मार -3' करते हैं और स्टैक ट्रेस catalina.out लॉग फ़ाइल में दिखाई देता है।

बार जब आप एक स्टैक ट्रेस है, अनुसूचक धागा पाते हैं और देखें कि यह क्या कर रहा है। क्या यह संभव है कि यह कार्य निष्पादित हो रहा था?

तुम भी अधिक मदद के लिए यहाँ स्टैक ट्रेस पोस्ट कर सकते हैं।

क्या जानना महत्वपूर्ण है क्या अनुसूचक आप का उपयोग है। यदि आप SimpleAsyncTaskExecutor का उपयोग करते हैं, तो यह प्रत्येक कार्य के लिए एक नया धागा शुरू करेगा, और आपका शेड्यूलिंग कभी विफल नहीं होगा। हालांकि, यदि आपके पास ऐसे कार्य हैं जो खत्म नहीं होते हैं, तो आप अंततः स्मृति से बाहर हो जाएंगे।

http://docs.spring.io/spring/docs/3.0.x/reference/scheduling.html

+0

के 'जारी किए गए शेड्यूल किए गए एक्सेक्यूशनएफ्टरएक्सप्शन' को सक्षम करना भी चाह सकते हैं धन्यवाद - थ्रेड डंप लेना पहले से ही निकोलस.हाउसचल्ड द्वारा प्रस्तावित किया गया है और मुझे आरईएसटी सेवा से अवरुद्ध HTTP कॉल मिला है। मैंने HttpClient लाइब्रेरी को अपडेट किया है और मुझे आश्चर्य है कि इससे पहले से ही समस्या हल हो सकती है। – obecker

9

के बाद से यह सवाल मैं पोस्ट करेंगे क्या (शायद बहुत विशिष्ट) मेरी समस्या का हल किया गया था, इतने सारे मत मिले।

हम अपाचे HttpClient पुस्तकालय का उपयोग कर रहे अनुसूचित नौकरियों में दूरस्थ सेवाओं के लिए कॉल करने के लिए। दुर्भाग्यवश अनुरोध करते समय कोई डिफ़ॉल्ट टाइमआउट सेट नहीं है।

connectTimeout 
connectionRequestTimeout 
socketTimeout 

से 30 सेकंड की समस्या को हल करने के बाद।

int timeout = 30 * 1000; // 30 seconds 
RequestConfig requestConfig = RequestConfig.custom() 
     .setConnectTimeout(timeout) 
     .setConnectionRequestTimeout(timeout) 
     .setSocketTimeout(timeout).build(); 
HttpClient client = HttpClients.custom() 
     .setDefaultRequestConfig(requestConfig).build(); 
+1

अपाचे एचटीपी क्लाइंट का उपयोग करने के लिए मुझे एक ही समस्या का सामना करना पड़ रहा था .... आप, मेरे दोस्त, एक सज्जन और विद्वान हैं! – nterry

+0

यह वास्तव में मेरी समस्या भी थी, विशेष रूप से एक पूलिंगहट्प क्लाइंट कनेक्शन कनेक्शन के साथ कॉन्फ़िगर किए गए अपाचेकनेक्टर के साथ जर्सी का उपयोग कर रहा था। ** कनेक्शनRequestTimeout ** पैरामीटर सेट करना महत्वपूर्ण है क्योंकि पूल सेट नहीं होने पर पूल अनिश्चित काल तक लटका सकता है। ऐसा करने के लिए, आपको इसे RequestConfig में सेट करना होगा और कनेक्टर क्लाइंट कॉन्फ़िगरेशन में संपूर्ण अनुरोध कॉन्फ़िगरेशन सेट करना होगा: 'RequestConfig rc = RequestConfig.custom()। SetConnectTimeout (2000) .setSocketTimeout (2000) .setConnectionRequestTimeout (200) .build(); clientConfig.property (ApacheClientProperties.REQUEST_CONFIG, आरसी); ' – David

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