2013-01-02 20 views
6

बंद करता है मैं नेटटी संस्करण 2.6.0 का उपयोग कर रहा हूं। अंतिम।नेटटी - कॉलिंग channel.disconnect() वास्तव में चैनल

यदि मैं नेटटी दस्तावेज़ीकरण को सही ढंग से समझ रहा हूं, तो चैनल पर डिस्कनेक्ट() को कॉल करने से मुझे बाद में कनेक्ट करने के लिए कनेक्ट() को कॉल करने की अनुमति मिलनी चाहिए। हालांकि, जब मैं डिस्कनेक्ट() को कॉल करता हूं, तो मेरे SimpleChannelHandler subclass के दोनों चैनल डिस्कनेक्ट() और channelClosed() को कॉल किया जाता है।

मैं डिबग मोड में इस खोला और मूल रूप से घटनाओं का क्रम है:

  1. मैं अपने चैनल
  2. Channels.disconnect() कहा जाता हो जाता है पर डिस्कनेक्ट() फोन:

    public static ChannelFuture disconnect(Channel channel) { 
        ChannelFuture future = future(channel); 
        channel.getPipeline().sendDownstream(new DownstreamChannelStateEvent(
         channel, future, ChannelState.CONNECTED, null)); 
        return future; 
    } 
    
  3. आखिरकार, NioSocketPipelineSink.eventSunk() को कॉल किया जाता है, और संबंधित भाग है:

    case CONNECTED: 
         if (value != null) { 
          connect(channel, future, (SocketAddress) value); 
         } else { 
          channel.worker.close(channel, future); 
         } 
         break; 
    

तो के बाद से मान शून्य है और राज्य से जुड़ा हुआ है, चैनल को बंद कर दिया जाता है (हालांकि here अशक्त के साथ जुड़ा के अनुसार डिस्कनेक्ट करने के लिए, जरूरी बंद नहीं एक अनुरोध का संकेत देना चाहिए।

तो क्या मुझे यहां कुछ याद आ रही है? डिस्कनेक्ट() का क्या मतलब है यदि यह केवल चैनल बंद होने पर परिणाम देता है?

यह एक बड़ी समस्या नहीं है, क्योंकि अगर मुझे अपनी स्थिति के लिए सिर्फ एक नया चैनल बनाना है, लेकिन शुरुआती निरीक्षण से यह नेटी बग की तरह लगता है, जब तक कि मैं सिर्फ गलत नहीं समझता कि यह कैसा लगता है काम या मैं मूर्खतापूर्ण कुछ कर रहा हूँ।

उत्तर

7

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

एक टीसीपी सॉकेट डिस्कनेक्ट करने का कार्य इसे बंद कर देता है (कम से कम जावा एपीआई परिप्रेक्ष्य से)। लेकिन यूडीपी सॉकेट को डिस्कनेक्ट करने से यह बंद नहीं हो रहा है, बस स्थानीय आईपी एड्रेस/पोर्ट और रिमोट आईपी एड्रेस/पोर्ट के बीच एसोसिएशन को हटा रहा है।

तो, नहीं, आप मूर्खतापूर्ण कुछ नहीं कर रहे हैं, लेकिन इसके बजाय मैं ओपन/बंद घटनाओं पर अभिनय करने की अनुशंसा करता हूं, जब तक कि आपके जीवनकाल के दौरान विभिन्न रिमोट लक्ष्यों के लिए यूडीपी सॉकेट को "कनेक्ट करने" की वास्तविक आवश्यकता न हो।

संपादित करें: पूर्ववर्ती पैराग्राफ में एक महत्वपूर्ण "नहीं" चूक गया।

+0

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

+0

एक टीसीपी कनेक्शन लगभग हमेशा उच्च स्तर पर "तंग" कनेक्शन का प्रतिनिधित्व करता है; अधिकतर मामलों के लिए यह उच्च कार्य कनेक्शन समाप्त होने पर उन्हें छोड़ने के बजाय निचले स्तर के संसाधनों का उपयोग करने की कोशिश कर रहे अधिक काम और अधिक भ्रम होगा। –