返回

java-捕获出站ChannelHandler的所有异常处理

发布时间:2022-04-24 16:45:27 481
# 移动端

在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...什么都没做。

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(2)
按点赞数排序
用户头像