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?
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? –
'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
Nochmals vielen Dank. Entschuldigung, ich habe auch nicht früher gestimmt :) –