2012-05-09 22 views
5

सबसे पहले, मैंने सीएफ व्यवस्थापक में टाइमआउट अनुरोध (सेकेंड) 20 पर सेट किया।कोल्डफ्यूजन अनुरोध टाइमआउट द्वारा अनंत लूप के साथ अनुरोध क्यों नहीं किया जाता है?

तो मैं जैसे while(true);

पेज एक पंक्ति जिस तरह से पिछले 20 सेकंड चलेंगे साथ एक CFM चलाते हैं, और धागा अभी भी जीवित है के रूप में मैं यह लिखा।

नीचे एक स्नैपशॉट सर्वर मॉनिटर के साथ लिया जाता है

Thread jrpp-3 request type - TEMPLATE REQUEST 
*Template Path - D:\Projects\infiniteLoop.cfm 
*Request Parameters - {} 
*Request Method - GET 
*Client IP address - 127.0.0.1 
*Thread elapsed time - 322659 milliseconds 

यह सामान्य है ?? यह CF9.0.1 है, डेवलपर संस्करण। जेआरयूएन के साथ मल्टी-इंस्टेंस सेटअप।

अनंत लूप को रोकने का एकमात्र तरीका सीएफ को पुनरारंभ करना है।

+2

हेनरी ... आप अनंत लूप के अंदर क्या कर रहे हैं। वहां कुछ चीजें हैं जो ग्लोबल टाइमआउट (डीबी कॉल, एफटीपी, चीजें जिन्हें बाहरी संसाधनों की आवश्यकता होती है) पसंद करते हैं। –

+0

दोस्तों ... यह प्रश्न CFTHREAD का कोई उल्लेख नहीं करता है ... सुनिश्चित नहीं है कि वह कहां से आ रहा है। –

+0

@ मार्कक्रागर मैं कुछ नया लागू करने की प्रक्रिया में हूं। कोड अभी भी अस्थिर हैं। मैंने इसे सीएफएसक्रिप्ट में लिखा था और सीएफ के अनुरोध टाइमआउट द्वारा असीमित रूप से निष्पादित किए जाने वाले कोडों की अपेक्षा नहीं की थी। – Henry

उत्तर

11

कोल्डफ्यूज़न में अनुरोध समय-समय पर आप जिस तरह से अपेक्षा करते हैं उसमें व्यवहार नहीं करते हैं। जिस तरह से यह प्रस्तुत किया गया है, आप कल्पना करेंगे कि एक वॉचडॉग है जो जांचता है कि आपका अनुरोध कब तक चल रहा है और अनुरोध समय समाप्ति के तुरंत बाद इसे मारता है। वास्तव में ऐसा प्रतीत होता है कि केवल कुछ टैग चलने पर ही सीएफ जांचता है कि अनुरोध का विलुप्त समय निर्धारित सीमा से अधिक है या नहीं। <cfoutput> टैग्स में से एक है जहां यह जांचता है, यही कारण है कि आप अक्सर सीएफआउटपुट को इंगित करते हुए टाइमआउट से अधिक संदेश देखते हैं, भले ही आपको पता चले कि इसे निष्पादित करने में लंबा समय नहीं लग रहा है।

<cfsetting requesttimeout="5" enableCFoutputOnly="no" /> 

<!--- Looping with a condition <cfloop blamed ---> 
<cfset request.counter=0 /> 
<cfloop condition="true"> 
    <cfset sleep(1000) /> 
    <cfset request.counter=request.counter+1> 

    <cflog file="timeout" text="#request.counter#"> 

    <cfif request.counter GT 8> 
     <cfbreak> 
    </cfif> 

</cfloop> 

<!--- Looping with an index, times out, naming CFLOOP as the offending tag ---> 
<cfloop index="foo" from="1" to="8"> 
    <cfset sleep(1000) /> 
</cfloop> 

<!--- Looping with an index, times out, naming CFOUTPUT as the offending tag ---> 
<cfloop index="foo" from="1" to="8"> 
    <cfset sleep(1000) /> 
    <cfoutput>Hello</cfoutput> 
</cfloop> 


<!--- Same loop, but in script. No timeout warning at all ---> 
<cfscript> 
for(foo=1;foo<=8;foo++){ 
    sleep(1000); 
} 
</cfscript> 

<!--- Same loop, now with WriteOutput() called. Still no timeout ---> 
<cfscript> 
for(foo=1;foo<=8;foo++){ 
    sleep(1000); 
    writeoutput("tick..."); 
} 
</cfscript> 

उपरोक्त कोड अनुरोध समय के कुछ अजीब व्यवहार को दिखाता है। जैसा कि मार्क क्रुगर ने इंगित किया था, बाहरी संसाधन के लिए किसी भी कॉल का मतलब टाइमआउट के लिए कोई जांच नहीं होगा, और मेरा अनुमान है कि आपके स्वयं के तर्क को निष्पादित करने वाले स्क्रिप्ट के बड़े ब्लॉक भी चेक नहीं किए जाएंगे, जिससे अगले आउटपुट कथन को दोषी ठहराया जा सकेगा।

यदि आपको पता लगाने की आवश्यकता है कि कोड कहां लगी हुई है और टाइमआउट संदेश गलत जगह पर इंगित कर रहे हैं, तो मैं लंबे समय से चलने वाले कोड चलते समय सर्वर से स्टैक निशान को पकड़ने के लिए लॉगिंग या जेस्टैक का उपयोग करता हूं। कुछ स्टैक निशान कुछ सेकंड अलग करें, फिर कोड को करने के लिए Samurai के माध्यम से लॉग फ़ाइल चलाएं।

+1

बार्नी - यह एक शानदार जवाब है। मुझे यह पसंद है। उदाहरणों के लिए धन्यवाद। एक ब्लॉग पोस्ट और कुछ और जांच के लिए एक अच्छा विकल्प की तरह लग रहा है। –

+0

मैं समुराई की सिफारिश करने के लिए उत्तर के लिए प्लस चाहता हूं। (लेकिन कुल मिलाकर एक महान जवाब भी!) – Sharondio

+0

आपकी जांच के लिए बहुत बहुत धन्यवाद! बहुत दिलचस्प/विषम परिणाम। किसने सोचा होगा, वही लूप, लेकिन cfscript में, अनुरोध टाइमआउट के खिलाफ जांच नहीं की जाएगी। इसे या तो सही किया जाना चाहिए, या कहीं भी दस्तावेज किया जाना चाहिए ... क्या आप सीएफ 9.0.1 का भी उपयोग कर रहे हैं? शायद हमें यह देखने के लिए सीएफ 7 या 8 के खिलाफ परीक्षण करना चाहिए कि यह वास्तव में एक ही परिणाम है या नहीं। – Henry

2

मुझे हेनरी जैसी ही चीज़ मिल रही है। यहाँ अपने परीक्षण कोड है:

Before thread<br /> 
<cfthread action="run" name="t1"> 
    <cfloop condition="true"> 
     <cfparam name="count" default="0"> 
     <cfset sleep(3000)> 
     <cflog file="cfthreadTest" text="Log entry #++count#"> 
    </cfloop> 
</cfthread> 
After thread<br /> 

मेरे अनुरोध का समय समाप्त CFAdmin में 20sec के लिए सेट है, और इस थ्रेड अब 15 मिनट से चल रहा है। उस ने कहा, एक धागा "अनुरोध" नहीं है, इसलिए मुझे यकीन नहीं है कि मैं अनुरोध समय सीमा का सम्मान करने की अपेक्षा करूंगा। दस्तावेज में कुछ भी नहीं है जिसे मैं पा सकता हूं जो सुझाव देता है कि इसे अनुरोध समय-समय पर सम्मान करना चाहिए। उस ने कहा ... धागे को मारने का कोई तरीका "आसान" होगा।

मुझे लगता है कि यह संदर्भ में केवल एक "उत्तर" है कि मुझे नहीं लगता कि आपकी अपेक्षाएं सही हैं, आप उम्मीद करते हैं कि आप अनुरोध समय-समय पर सम्मान करें।

+0

Thx, लेकिन मुझे शीर्षक में 'थ्रेड' शब्द शामिल नहीं करना चाहिए, क्योंकि मैंने cfthread का उपयोग नहीं किया था। प्रश्न अपडेट किया गया। – Henry

+0

ठीक है, ठीक है उस मामले में कोई @ barnyr के जवाब से पहले नहीं जा सकता है। –

2

आपने जो बताया है वह दुर्भाग्य से अपेक्षित व्यवहार है जब आप कोल्डफ्यूजन में अनुरोध समय-समय पर जांच की बाधाओं को जानते हैं। (माना जाता है, यह अपेक्षित व्यवहार नहीं होना चाहिए।)

चार्ली अरेहार्ट द्वारा टाइमआउट मुद्दों को कवर करने में एक लंबा blog post है। एक खंड का शीर्षक है "सीएफ अगले ऑपरेशन की शुरुआत में समय की जांच करता है, लेकिन दुख की बात है कि केवल कुछ टैग पर"। दुर्भाग्य से cfscript उन में से एक नहीं है, और टाइमआउट को शुद्ध स्क्रिप्ट कोड से चेक नहीं किया जाएगा।हालांकि, टैग्स में से एक जो टाइमआउट चेक ट्रिगर करता है cfoutput है और उस ज्ञान के साथ स्क्रिप्ट आधारित कोड सम्मान अनुरोध टाइमआउट बनाना संभव है। हालांकि यह एक मैन्युअल प्रक्रिया है जिसमें आपको खुद को तय करने की आवश्यकता है कि आपको टाइमआउट के लिए जांच करनी चाहिए।

<cffunction name="cf_checkRequestTimeout" access="public" output="false" returntype="void" hint="Force CF to check if the request has timed out."> 

    <!--- CF checks Request timeout on cfoutput tag use. ---> 
    <cfoutput></cfoutput> 

</cffunction> 

<cfscript> 
    for(foo=1;foo<=61;foo++){ 
     sleep(1000); 
     cf_checkRequestTimeout(); 
    } 
</cfscript> 

उत्पन्न लाइन 4, जो भ्रामक है इसके लिए जिम्मेदार होगा त्रुटि है, लेकिन स्टैकट्रेस दिखाएगा कि समारोह लाइन 11 है, जो तब आप को पता है जो कोड की बिट का समय समाप्त हो की अनुमति देता है से बुलाया गया था। जाहिर है कि उस ज्ञान की ग्रैन्युलरिटी टाइमआउट की जांच की आवृत्ति पर आधारित है।

cf_checkRequestTimeout (नहीं checkRequestTimeout क्योंकि है कि एक गैर-दस्तावेजी आंतरिक सीएफ समारोह है) cfscript के बाहर के साथ-साथ कहा जा सकता है, तो आप के बाद cf_checkRequestTimeout कॉल डाल सकते हैं, उदाहरण के लिए यदि आप एक cfquery आपको लगता है तो टाइमआउट समस्या आ रही है है cfquery और टाइमआउट त्रुटियां प्राप्त करें जहां उन्हें कोड निष्पादन को आगे बढ़ाने के बजाय होना चाहिए।

+0

@ हेनरी टाइमआउट के लिए अनुरोध प्राप्त कर रहा है, और यह पता लगाने के लिए कि अनुरोध समय समाप्ति के लिए क्या हो रहा था, दो अलग-अलग चीजें हैं। यह जवाब बस होने के बारे में है। आप कहते हैं "जो आग्रह फेंक रहा था" क्या आपका मतलब लूप का पुनरावृत्ति है? इसे समझने के लिए आपको कुछ और तर्क जोड़ने की आवश्यकता होगी। – nosilleg

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

  • कोई संबंधित समस्या नहीं^_^