2013-01-20 24 views
7

नेटटी एनओओ लिब का उपयोग करके जावा में विकसित एक डाउनलोड क्लाइंट के लिए मैंने बैंडविड्थ सीमा सुविधा भी लागू की। तकनीकी रूप से मैं ग्लोबल ट्रैफिकशैपिंग हैंडलर ऑब्जेक्ट के माध्यम से ऐसा करता हूं। मैं NIO ग्राहक पाइपलाइन को प्रारंभ इस वर्ग 'JavaDoc के आधार पर इस प्रकार है:जावा नेटटी के साथ बैंडविड्थ उपयोग को सही तरीके से कैसे सीमित करें?

... 
trafficHandler = new GlobalTrafficShapingHandler(
     new HashedWheelTimer(), 0, 0, 1000); 
execHandler = new ExecutionHandler(
     new OrderedMemoryAwareThreadPoolExecutor(20, 0, 0)); 
... 

public ChannelPipeline getPipeline() throws Exception 
{ 
    // create default pipeline 
    ChannelPipeline pipeline = pipeline(); 

    // traffic shaping handler 
    pipeline.addLast("global-traffic-shaping", trafficHandler); 

    // SSL support 
    if(useSSL) 
    { 
     SSLEngine sslEngine = createSSLEngine(); 
     pipeline.addLast("ssl", new SslHandler(sslEngine)); 
    } 

    // memory executor 
    pipeline.addLast("memory-executor", execHandler); 

    // business logic 
    pipeline.addLast("data-processing", 
     new NettyNioClientHandler(
      nettyNioClient, localer, logger, ncMgr, username, useSSL)); 

    return pipeline; 
} 

और रनटाइम के दौरान मैं तो अधिकतम निर्धारित किया है।

public void setDlSpeedLimit(long limit) 
{ 
    if(limit < 0) 
     return; 

    trafficHandler.configure(0, limit * 1000L); 
} 

ठीक है के माध्यम से गति डाउनलोड, तो मूल रूप से netty NIO कार्यक्षमता ठीक है और तेजी से काम करता है। जब मैं अधिकतम सेट करता हूं। एप्लिकेशन में डाउनलोड की गति, मैं यह भी देख सकता हूं कि बैंडविड्थ उपयोग वास्तव में अधिकतम पर कैप्ड किया गया है। स्तर। मैं बैंडविड्थ उपयोग की निगरानी

trafficHandler.getTrafficCounter().getLastReadThroughput(); 

हालांकि, दुर्भाग्य से अधिकतम। गति मैं मॉनीटर करता हूं कि मैंने इसे पहले सेट नहीं किया है, न कि करीब भी। उदाहरण के लिए, मैं मूल रूप से (डब्ल्यू/ओ सीमा) के बारे में 2000 केबी/एस की डाउनलोड गति है, फिर मैंने ऊपर वर्णित अनुसार 300 केबी/एस तक सीमा निर्धारित की है, लेकिन असली डाउनलोड गति 700-900 केबी/रों।

तो इस मामले में मेरी समस्या यह है: मैं देख सकता हूं कि यातायात शटर कुछ कर रहा है, लेकिन जैसा कि मैं चाहता था। क्या मुझे यहां कुछ याद आती है, उदाहरण के लिए पाइपलाइन प्रारंभ में कोई कदम?

आपकी मदद के लिए अग्रिम धन्यवाद!

उत्तर

0

ठीक है, तो ऐसा लगता है कि अन्य विचार नहीं हैं।
एकमात्र चीज जिसने मुझे थोड़ा सा मदद की थी, समय काउंटर को 5-10 सेकेंड तक बढ़ा देना था।

चीयर्स!

0

आपकी getPipeline() हर बार एक नई पाइपलाइन अनुरोध के लिए GlobalTrafficShapingHandler तत्काल है। आपको केवल एक को तुरंत चालू करना चाहिए और इसके बजाय सभी पाइपलाइनों में इसका पुन: उपयोग करना चाहिए। यह अन्य वर्गों के लिए भी सच है, जैसे कि HashedWheelTimer

नेटटी में कुछ कक्षाएं हैं जिन्हें पाइपलाइनों के बीच साझा किया जाना चाहिए। आम तौर पर दस्तावेज स्पष्ट रूप से इसका उल्लेख करता है। आपको प्रत्येक कक्षा के जावाडोक की जांच करनी चाहिए और सुनिश्चित करें कि आप उनका अनुसरण कर रहे हैं।

+0

आप निश्चित रूप से सही हैं, हकीकत में मैंने आपके कोड में सुझाव दिया था। GlobalTrafficShapingHandler, HashedWheelTimer, और ExecutionHandler क्लास कन्स्ट्रक्टर में पहले बनाया गया है। क्षमा करें अगर मेरी मूल पोस्ट ने आपको उस संबंध में भ्रमित कर दिया है। मैंने तदनुसार इसे अद्यतन किया है। – Matthias