2009-06-29 11 views
10

मेरे पास एक सर्वर है जो कई क्लाइंट्स के साथ संवाद करने के लिए रिमोट एक्टर्स फ्रेमवर्क का उपयोग कर रहा है। जैसा कि this question में बताया गया है, मुझे क्लाइंट गायब होने पर ट्रैक रखने में परेशानी हो रही है। इसलिए मेरा सर्वर अभी भी मौजूद गैर-मौजूद ग्राहकों को संदेश भेजने का प्रयास कर रहा है।क्लाइंट को लिखने का प्रयास करते समय रिमोट-एक्टर फ्रेमवर्क क्या करता है जो अब नहीं है?

  • क्या यह कोई समस्या है? (मैं नहीं दिख रहा है किसी भी अपवाद फेंक दिया जा रहा है - लेकिन मैं वहाँ हो जाएगा स्मृति मुद्दों मान यदि अपने सर्वर लंबे समय तक रहा है)
  • मैं कैसे पता लगा सकते हैं कि संदेश एक ग्राहक के लिए नहीं रह गया है भेजा जा रहा है सुन रहे हैं? (मैं कनेक्शन सफाई किसी तरह लागू करना चाहते हैं)
+0

क्या आपने अभिनेता विशेषता के trapExit सदस्य पर एक नज़र डाली है? यह यहां प्रलेखित है: http: //www.scala-lang।संगठन/docu/फ़ाइलें/अभिनेता-एपीआई/actors_api_guide_1.html – djondal

उत्तर

1

ठीक है, मैं कुछ यहाँ का जोखिम होगा।

अस्वीकरण: आप नीचे क्या पढ़ेंगे इसके बावजूद, आप start here कर सकते हैं।

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

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

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

किसी भी मामले में, आप (और आपको) किसी क्लाइंट-सर्वर वार्तालाप को समाप्त कर सकते हैं। यह संसाधनों को छोड़ने और स्थापित कनेक्शन समाप्त करने में मदद करेगा। इस आशय के लिए:

  1. आपका क्लाइंट अभिनेता सर्वर के लिए एक रोक संदेश भेजना चाहिए और जो कुछ भी बाहर निकलने के समारोह स्केला अभिनेता वर्ग के लिए लागू किया गया है के साथ इसके निष्पादन को समाप्त।

  2. स्टॉप संदेश प्राप्त करने पर, सर्वर अभिनेता को क्लाइंट को का उत्तर नहीं देना चाहिए। इसकी बजाय इसे क्लीनअप (यदि कोई हो) करना चाहिए और ग्राहक अभिनेता के समान निष्पादन को समाप्त करना चाहिए।

इस तरह आप शामिल सभी कलाकारों की उचित समाप्ति सुनिश्चित करते हैं और संसाधनों की सही रिहाई सुनिश्चित करते हैं।

मुझे आशा है कि इससे किसी भी तरह मदद मिलेगी। दुर्भाग्य से मैं खुद स्कैला से परिचित नहीं हूं। अन्यथा मैं कुछ कोड ला सकता हूं। लेकिन उपर्युक्त लिंक, उम्मीद है कि मदद करनी चाहिए।

+2

मुझे डर है कि यह दृष्टिकोण सिर्फ काम नहीं करता है। आप गारंटी नहीं दे सकते कि * स्टॉप * विधि सर्वर पर भेजी जाती है और जब ऐसा होता है, क्लाइंट एक्टर के लिए सर्वर-साइड चैनल * प्रॉक्सी * का मेलबॉक्स भर जाता है और अंततः सर्वर क्रैश हो जाता है क्योंकि यह स्मृति से बाहर हो जाता है। मुझे पता चला है कि ग्राहकों के लिए टाइमर पर "पट्टा" नवीनीकरण करने के लिए एकमात्र तंत्र है: सर्वर समय-समय पर पट्टे की जांच करता है और किसी भी समय समाप्त होने वाले –

+0

+1 को फेंक दिया जाता है। मैं सहमत हूं, ऑक्सबो। लेकिन मैं अभी भी कोड करता हूं कि उन मामलों पर सामान्य, तेज़ समाप्ति के लिए एक स्टॉप संदेश के आसपास संदेश प्राप्त होता है। –