java-捕获出站ChannelHandler的所有异常处理
发布时间:2022-04-24 16:45:27 450
相关标签: # 移动端
在Netty中,你有入站和出站处理程序的概念。只需在管道的末端(尾部)添加通道处理程序并实现exceptionCaught
推翻在入站管道中发生的异常将沿着处理程序传播,直到遇到最后一个异常(如果不在过程中处理)。
对于即将离职的经理人来说,情况并非完全相反。相反(根据Netty in Action,第94页),你需要在频道的 Future
或是一个听众Promise
进入write
你的工作方法Handler
.
由于我不确定在哪里插入前者,我想我会选择后者,所以我做了以下几点ChannelOutboundHandler
:
/**
* Catch and log errors happening in the outgoing direction
*
* @see p94 in "Netty In Action"
*/
private ChannelOutboundHandlerAdapter createOutgoingErrorHandler() {
return new ChannelOutboundHandlerAdapter() {
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
logger.info("howdy! (never gets this far)");
final ChannelFutureListener channelFutureListener = future -> {
if (!future.isSuccess()) {
future.cause().printStackTrace();
// ctx.writeAndFlush(serverErrorJSON("an error!"));
future.channel().writeAndFlush(serverErrorJSON("an error!"));
future.channel().close();
}
};
promise.addListener(channelFutureListener);
ctx.write(msg, promise);
}
};
这将添加到管道的顶部:
@Override
public void addHandlersToPipeline(final ChannelPipeline pipeline) {
pipeline.addLast(
createOutgoingErrorHandler(),
new HttpLoggerHandler(), // an error in this `write` should go "up"
authHandlerFactory.get(),
// etc
问题是write
如果在错误处理程序中引发运行时异常,则永远不会调用错误处理程序的方法HttpLoggerHandler.write()
.
我该怎么做?任何传出处理程序中的错误应为;“泡泡起来”;连在头上的那个。
需要注意的一件重要事情是,我不只是想关闭通道,我想向客户机回写一条错误消息(从serverErrorJSON('...')
.在我试着按照处理程序的顺序移动时(也尝试了这个答案中的内容),我已经激活了听者,但我无法写任何东西。如果我用ctx.write()
在监听器中,当我使用future.channel().write...
什么都没做。
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报