2012-01-23 9 views
6

मैं इस तरह के रूप संचालकों की एक पाइप लाइन बनाने के लिए करना चाहते हैं:Netty कैसे एक ही पाइप लाइन में संचालकों के बीच सूचना पारित करने के लिए

public ChannelPipeline getPipeline() throws Exception 
{ 
    return Channels.pipeline(
      new ObjectEncoder(), 
      new ObjectDecoder(), 
      new AuthenticationServerHandler(), 
      new BusinessLogicServerHandler()); 
} 

कुंजी यहाँ है कि मैं AuthenticationServerHandler चाहते हैं पारित करने के लिए सक्षम होने के लिए है BusinessLogicServerHandler पर लॉगिन जानकारी।

मुझे समझ में आता है कि आप Attachment का उपयोग कर सकते हैं, हालांकि केवल उस हैंडलर के लिए जानकारी संग्रहीत करता है, पाइपलाइन में अन्य हैंडलर इसका उपयोग नहीं कर सकते हैं। मैंने यह भी देखा कि ChannelLocal नामक कुछ ऐसा था जो चाल कर सकता है, हालांकि मुझे इसका उपयोग करने के बारे में कोई वास्तविक जानकारी नहीं मिल रही है। मैंने जो कुछ देखा है, वह लोग इसके लिए एक स्थिर उदाहरण बनाते हैं, लेकिन आप किसी अन्य हैंडलर में जानकारी को कैसे प्राप्त और एक्सेस करते हैं? मान लें कि यह सही तरीका है।

मेरा प्रश्न है: कैसे आप एक ही पाइप लाइन में संचालकों के बीच जानकारी पास है। उपर्युक्त उदाहरण में, मैं AuthenticationServerHandler से BusinessLogicServerHandler पर लॉगिन प्रमाण-पत्र कैसे पास करूं?

उत्तर

2

चैनललोकल एटीएम जाने का तरीका है। बस कहीं एक स्थिर उदाहरण बनाएं और उसके बाद चैनल को सेट/प्राप्त विधि पर पास करके अपने हैंडलर के भीतर से एक्सेस करें। इस तरह आप अपने चैनलों के बीच सामान साझा कर सकते हैं।

+1

यही वह है जिसे मैंने समझ लिया (अवधारणा में अधिक या कम), लेकिन मुझे यह कैसे करना है इस पर कहीं भी कोई उदाहरण नहीं मिला है। मैं अभी भी विवरण पर थोड़ा फजी ... –

+1

हम इसे उपयोग नहीं कर रहे अपाचे जेम्स प्रोटोकॉल पर अब कर रहा हूँ, लेकिन मुझे लगता है कि आप पुराने कोड से विचार प्राप्त कर सकते हैं: http://svn.apache.org/viewvc /james/protocols/tags/protocols-1.5/impl/src/main/java/org/apache/james/protocols/impl/ChannelAttributeSupport.java?view=markup http://svn.apache.org/viewvc/ जेम्स/प्रोटोकॉल/टैग/प्रोटोकॉल-1.5/impl/src/मुख्य/जावा/org/अपाचे/जेम्स/प्रोटोकॉल/impl/AbstractChannelUpstreamHandler.java? दृश्य = मार्कअप –

+0

यहाँ ChannelLocal के लिए एक उदाहरण है। http://stackoverflow.com/questions/8449663/usage-of-nettys-channellocal – Veebs

2

मैं एक आंतरिक स्थिर मानचित्र की कमी के साथ ChannelLocal कार्यान्वयन के एक प्रशंसक नहीं था, तो क्या मैं अब के लिए चैनल के लगाव पर अपना वस्तु डाल रहा था कर समाप्त हो गया:

ctx.getChannel().setAttachment(myobj); 

तो मैं कर "myobj" मूल रूप से एक संदर्भ POJO जिसमें अब तक अनुरोध के बारे में एकत्र की गई सारी जानकारी शामिल है।

public class RequestContext { 
    private String foo = ""; 

    public String getFoo(){ 
     return foo; 
    } 
    public void setFoo(String foo){ 
     this.foo = foo; 
    } 

} 

RequestContext reqCtx = new RequestContext(); 
reqCtx.setFoo("Bar"); 

ctx.getChannel().setAttachment(reqCtx); 
reqCtx = (RequestContext)ctx.getChannel().getAttachment(); 

यह सुंदर नहीं है, लेकिन यह काम करता है ...

+0

हां लेकिन अटैचमेंट नहीं है आपकी पाइपलाइन में अन्य हैंडलरों के विपरीत, जो कि मेरे पास है। –

+2

चैनल पर अटैचमेंट करता है। मैं अब इसका उपयोग कर रहा हूं और यह ठीक काम करता है। जहां भी चैनल जाता है वहां जाता है। –

0

मैं प्रत्येक चैनल के लिए पाइप लाइन की रचना करने के समर्पित उदाहरणों का उपयोग करके अगले वालों के लिए एक हैंडलर से जानकारी गुजरती हैं, और होने से संचालकों प्रत्येक संदर्भ प्रत्येक पाइपलाइन के भीतर अन्य।

जानकारी के गुजरने के बिना किसी समस्या के पुराने तरीके से किया जाता है, बहुत बस।

+1

एक छोटा कोड नमूना लंबा सफर तय करेगा। –

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