2017-12-07 1 views
0

Angenommen, ich ein eingehenden Kanal-Handler wie diese:Mit Netty 4, wie handle ich Referenz gezählt Objekte, wenn eine Ausnahme in einem Handler geworfen wird?

public class Handler extends ChannelInboundHandlerAdapter {                                                     

    @Override                                                                
    protected void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {                                              
     // msg is actually a reference counted object                                                      
    }                                                                  

    @Override                                                                
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {                                            
     // Handle exception here, can't release msg since it's not passed.                                                 
    }                                                                  
} 

Da exceptionCaught nicht die eingehende Nachricht in seiner Signatur erhält, wie es scheint, gibt es keine Möglichkeit, dass der Verweis gezählt Objekt, um sicherzustellen, ist freigegeben. Es scheint, dass ich gezwungen bin, den gesamten Inhalt von channelRead in einen try/catch-Block zu packen, um sicherzustellen, dass ich für irgendwelche Ausnahmen richtig wiederherstellen kann, ohne den gesamten Prozess zu beenden. Ist das wahr?

Antwort

1

Sie sollten Ihre Referenz gezählt Objekte innerhalb der Probe-endlich, wie von der Netty quick start tutorial gezeigt.

Dies kann wie folgt geschehen:

public class Handler extends ChannelInboundHandlerAdapter {                                                     

    @Override                                                                
    protected void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {                                              
     try { 
      // msg is actually a reference counted object 
     } finally { 
      ReferenceCountUtil.release(msg); 
     }                                                  
    }                                                                  

    @Override                                                                
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {                                            
     // Handle exception here, can't release msg since it's not passed.                                                 
    }                                                                  
} 

Beachten Sie, dass ich ReferenceCountUtil.release(msg); statt nur msg.release() genannt habe, ist dies, weil die Tatsache, dass die ersten automatisch Aufruf überprüft, ob das betreffende Objekt freigegeben werden kann, während Für Letzteres müssen Sie das Objekt auf einen anderen Typ umwandeln, bevor Sie die Freigabemethode aufrufen können.

+0

Richtig, aber wenn ich die gesamte 'channelRead()' Methode in einem try/finally umbrechen muss, was ist der Punkt von 'exceptionCaught()'? Abfangen von Ausnahmen, die sich ausbreiten? Abfangen von Ausnahmen von anderen Handler-Methoden, die nicht die Anforderung haben, dass Elemente, die als Referenz gezählt wurden, freigegeben werden müssen? –

+0

'exceptionCaught' ist der zentrale Punkt für Ausnahmen, nicht nur die Ausnahmen von' channelRead', sondern auch Ausnahmen, die in anderen Methoden Ihres Handlers wie 'channelWrite' oder sogar Ausnahmen von anderen Handlern ausgelöst werden. Sie können nety sogar so konfigurieren, dass während des Schreibens in die Ausnahme caught alle niederwertigen NIO-Ausnahmen ausgelöst werden. Alternativ können Sie 'SimpleChannelInboundHandler' anstelle von' ChannelInboundHandlerAdapter' erweitern und es wird das Referenzobjekt für Sie gezählt. – Ferrybig

+0

Nochmals vielen Dank. Entschuldigung, ich habe auch nicht früher gestimmt :) –

Verwandte Themen