2009-10-22 7 views
5

मुझे नेटवर्क पर किसी अन्य डिवाइस से कनेक्शन बंद करने के लिए किसी तृतीय पक्ष जावा ऑब्जेक्ट पर कॉल निष्पादित करने के लिए Application.cfc के हिस्से के रूप में onApplicationEnd() का उपयोग करने की आवश्यकता है।ऑन एप्लिकेशंस एंड - क्या सीएफ वास्तव में बंद हो रहा है?

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

कोड:

<cffunction name="onApplicationEnd" returnType="void"> 
    <cfargument name="appScope" required="true" /> 

    <cfset var logLocation = "test" /> 

    <cflog file="#logLocation#" text="*** [Application.cfc] - **** START RUN ****" /> 
    <cflog file="#logLocation#" text="*** [Application.cfc] - #timeformat(now(),'HH:mm:ss')# - onApplicationEnd() called " /> 


    <cftry> 

     <cfif structKeyExists(ARGUMENTS, "appScope")> 
      <cflog file="#logLocation#" text="*** [Application.cfc] - #timeformat(now(),'HH:mm:ss')# - ARGUMENTS.appScope is defined" /> 
     <cfelse> 
      <cflog file="#logLocation#" text="*** [Application.cfc] - #timeformat(now(),'HH:mm:ss')# - ARGUMENTS.appScope is undefined! " /> 
     </cfif> 

     <!--- Check if we have a test crypto object in scope, and if so close it's connection ---> 
     <cfif structKeyExists(ARGUMENTS.appScope, "testCrypto")> 

      <cflog file="#logLocation#" text="*** [Application.cfc] - #timeformat(now(),'HH:mm:ss')# - onApplicationEnd() - crypto object exists in app scope" /> 

      <cfset ARGUMENTS.appScope.testCrypto.closeConnection() /> 
      <<cflog file="#logLocation#" text="*** [Application.cfc] - #timeformat(now(),'HH:mm:ss')# - onApplicationEnd() - closed crypto server connection" /> 

     <cfelse> 
      <cflog file="#logLocation#" text="*** [Application.cfc] - #timeformat(now(),'HH:mm:ss')# - onApplicationEnd() - NO crypto server connection present to close" /> 
     </cfif> 

      <cfcatch type="any"> 

       <cflog file="#logLocation#" text="*** [Application.cfc] - #timeformat(now(),'HH:mm:ss')# - onApplicationEnd() - Error - #cfcatch.message#" /> 

      </cfcatch> 

     </cftry> 
    <cflog file="#logLocation#" text="*** [Application.cfc] - #timeformat(now(),'HH:mm:ss')# - onApplicationEnd() ended " /> 

</cffunction> 

लाइन बंद करने के लिए मेरी वस्तु पर कनेक्शन संदेश के साथ विफल हो रहा है: 'java.lang.IllegalStateException: प्रगति में शटडाउन'।

यहाँ एक रन के लिए पूर्ण लॉग हैं:

"Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc] - **** START RUN 

"Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc] - 09:05:54 - onApplicationEnd() called " 

"Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc] - 09:05:54 - ARGUMENTS.appScope is defined" 

"Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc] - 09:05:54 - onApplicationEnd() - crypto object exists in app scope" 

"Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc] - 09:05:54 - onApplicationEnd() - Error - Shutdown in progress" 

"Information","Thread-8","10/23/09","09:05:55",,"*** [Application.cfc] - 09:05:55 - onApplicationEnd() ended " 

वहाँ मैं क्या onApplicationEnd() में कर सकते हैं करने के लिए प्रतिबंध है और यदि ऐसा है तो क्या कोई काम के आसपास है?

मैं एक विंडोज एक्सपी मशीन पर सीएफ 8 (8,0,1,195765) डेवलपर संस्करण का उपयोग कर रहा हूं।

इसके अलावा, अगर मैं कंसोल विंडो में सीएफ चलाता हूं और CTRL-C दबाता हूं, तो मुझे यह दिखाई देता है, लेकिन अगर मैं cfstop चलाता हूं तो मुझे यह व्यवहार भी दिखाई देता है।

अग्रिम में बहुत धन्यवाद!

संपादित करें: कुछ अन्य लोगों को यह समस्या here थी, लेकिन कोई समाधान नहीं था।

संपादित करें: हटाया गया थ्रेड उदाहरण क्योंकि यह समस्या को धुंधला कर सकता है। पोस्ट कोड और लॉग।

उत्तर

3

ऐसा लगता है कि इस तथ्य यह है कि सर्वर बंद हो रहा है, बल्कि सिर्फ सीएफ आवेदन से कारण हो सकता है onRequestEnd का उपयोग करके देखें shound। मैं अनुमान लगा रहा हूं कि यदि JVM पहले से बंद होने की प्रक्रिया में है, तो आपके जावा क्लास का उपयोग करने वाले संसाधन उस बिंदु पर उपलब्ध नहीं हो सकते हैं। तो आवेदन पर और उस कोड के लिए सही जगह नहीं हो सकती है।

आप ShutdownHook जोड़ने में लगना चाहते हैं। मैं 100% सकारात्मक नहीं हूं, लेकिन मुझे लगता है कि वहां पर क्लीनअप कोड डालने के बजाय, ऐप्लिकेशंस एंड जावा जावा ऑब्जेक्ट को अपनी सफाई थ्रॉप्स चरण में प्रवेश करने से पहले इसकी सफाई करने की अनुमति दे सकता है।

लेकिन यह सब कहकर, सर्वर पर बंद होने के बाद "नेटवर्क पर किसी अन्य डिवाइस से कनेक्शन" स्वचालित रूप से बंद नहीं होगा?

+0

मैं मानता हूं कि यह मामला हो सकता है और इस हुक का उपयोग करके जांच करेगा। मैं सीएफ 8 का उपयोग कर रहा हूं, मुझे लगता है कि 9 ने इसे एप्लीकेशन.cfc में बनाया है। आपकी आखिरी टिप्पणी के बारे में: मुझे ऐसा करने का पूरा कारण तीसरे पक्ष के डिवाइस के कनेक्शन के एक सुंदर शट डाउन की कमी है। –

+0

@Leigh - इसके निचले भाग में आने के बारे में खेद है, अन्य सामानों में व्यस्त रहा है। मुझे शट डाउन हुक विधि में थ्रेड पास करने की आवश्यकता है। मैंने मार्क मंडेल द्वारा जावालोडर को मेरी सहायता करने के लिए देखने का निर्णय लिया है: http://www.compoundtheory.com/?action=displayPost&ID=422। मुझे लगता है कि मैं एक सीएफसी बना सकता हूं जो हुक विधि को पास करने के लिए रननेबल लागू करता है। अन्य सुझावों का स्वागत है! –

+0

बहुत सारे परीक्षण और यहां कुछ और चर्चा के बाद: http://forums.adobe.com/message/2337930#2337930 मुझे कोई रास्ता नहीं मिल रहा है कि यह विश्वसनीय रूप से किया जा सके। यहां तक ​​कि एक थ्रेड बनाना और इसे सर्वर रनटाइम शट-डाउन हुक में पास करना अच्छा नहीं है, सर्वर के शट-डाउन संदर्भों के बाहर ठीक थ्रेड चलने के बावजूद मुझे शून्य सूचक अपवाद मिलता है। हर किसी की मदद के लिए बहुत धन्यवाद, मैं आवेदन अंत से पहले शट डाउन कोड को कॉल करने के लिए एक कार्य-आसपास लागू कर रहा हूं, यानी सामान्य अनुरोध के माध्यम से। –

2

दस्तावेज़ों के अनुसार "आप उपयोगकर्ता विधि पर डेटा प्रदर्शित करने के लिए इस विधि का उपयोग नहीं कर सकते हैं, क्योंकि यह किसी अनुरोध से संबद्ध नहीं है।"

मुझे लगता है कि "अनुरोध के साथ संबद्ध नहीं है।" क्या चाबी है। यह हो सकता है कि आपकी जावा ऑब्जेक्ट केवल अनुरोध थ्रेड के भीतर मौजूद हों, न कि ऐप इंस्टेंस में।

शायद बजाय आप

http://livedocs.adobe.com/coldfusion/8/AppEvents_09.html

+0

एचएम। यह मुझे लगता है जैसे ऑब्जेक्ट केवल OnAplicationEnd में बनाया गया था, और शायद यह कुछ डेटा तक पहुंचने का प्रयास कर रहा था जो OnAplicationEnd के भीतर से उपलब्ध नहीं है। हालांकि त्रुटि संदेश को देखे बिना कहना मुश्किल है .. या कुछ कोड। – Leigh

+0

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

+0

हां, एप्लिकेशन स्कोप की एक प्रति OnAplicationEnd में पास की जाती है। मैं परीक्षण के लिए अब "समानांतर धागे" के साथ छोड़ दूंगा। एप्लिकेशन स्कोप्ड ऑब्जेक्ट का उपयोग करते समय केवल त्रुटियों पर ध्यान केंद्रित करें। – Leigh

1

वैसे मेरा पहला विचार यह है कि जब एप्लिकेशन बंद हो जाता है तो सर्वर वास्तव में रुकता नहीं है ... एप्लिकेशन बंद हो जाएगा, लेकिन सर्वर साथ चिपकने के लिए उत्तरदायी है।यदि आपके पास पुरानी Application.cfm वाली निर्देशिका है और उस निर्देशिका में केवल कुछ फ्लैट .cfm फ़ाइलें हैं, तो लोग उन सीएफ पृष्ठों का अनुरोध कर सकते हैं और वे किसी भी प्रकार के एप्लिकेशन संदर्भ से जुड़े नहीं हो सकते हैं। तो आप वास्तव में कोई अनुप्रयोग नहीं चल सकते हैं और अभी भी बहुत से सीएफ पृष्ठों की सेवा कर रहे हैं। अनुमोदित, ऐसा नहीं है कि लोग आम तौर पर अपने सीएफ सर्वर कैसे स्थापित करते हैं, लेकिन वे इस तरह से काम करते हैं। भविष्य में संस्करण में Server.cfc जैसे Server.cfc बनाने की कुछ बात हुई है, हालांकि मुझे नहीं पता कि उन्होंने इसे CF9 में लागू किया है या नहीं।

मेरा दूसरा विचार यह है कि विशिष्ट त्रुटि "java.lang.IllegalStateException: प्रगति में शट डाउन" का कारण बनने के लिए onApplicatinEnd विधि का एकमात्र तरीका होगा यदि जावा ऑब्जेक्ट्स आप संदर्भित कर रहे हैं तो वे जावा ऑब्जेक्ट्स हैं जो किसी भी तरह से आंतरिक रूप से जुड़े हुए हैं एप्लिकेशन संदर्भ में, जैसे ऑब्जेक्ट्स जिन्हें आप अनियंत्रित ColdFusion.server.ServiceFactory के माध्यम से एक्सेस कर सकते हैं। लेकिन आपके द्वारा पोस्ट किया गया कोड ऐसा नहीं दिख रहा है।

यह एक लंबा शॉट है, लेकिन आप testCrypto ऑब्जेक्ट को स्थानीय/अस्थायी चर में ऑनएप्लिकेशन एंड विधि के भीतर रखने और इसे वहां से निष्पादित करने का प्रयास कर सकते हैं।

क्षमा करें मैं और अधिक हेलफुल नहीं हो सकता था।

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