Netty 4中的超时事件

3

您好,我希望在一定时间内没有调用messageReceived时收到一个事件。我尝试使用ReadTimeoutHandler,但它会产生异常,并且需要在exceptionCaught()中处理,我会在那里进行一些工作并返回而不关闭上下文。但是,在那之后,我遇到了一堆异常。

Nov 18, 2012 8:56:34 AM io.netty.channel.ChannelInitializer
WARNING: Failed to initialize a channel. Closing: [id: 0xa81de260, /127.0.0.1:59763 => /127.0.0.1:59724]
io.netty.channel.ChannelHandlerLifeCycleException: io.netty.handler.timeout.ReadTimeoutHandler is not a @Sharable handler, so can't be added or removed multiple times.
    at io.netty.channel.DefaultChannelPipeline.callBeforeAdd(DefaultChannelPipeline.java:629)
    at io.netty.channel.DefaultChannelPipeline.addLast0(DefaultChannelPipeline.java:173)

我做的是正确的吗?

谢谢


你能分享一下你的代码吗?我很想看看你是如何处理异常的。 - Norman Maurer
如果 (cause instanceof ReadTimeoutException) { 返回; } - Dan Tran
从我所看到的情况来看,你想将同一个 io.netty.handler.timeout.ReadTimeoutHandler 实例添加到多个管道中。是否是这种情况? - Norman Maurer
啊,你的建议很不错,我需要在我的ChannelInitializer中每次调用initChannel时创建新的ReadTimeoutHandler。此外,有没有一种方法可以通知我的最终处理程序客户端关闭了通道?当客户端退出时,我没有看到服务器端引发任何异常。 - Dan Tran
最好的方式是进行某种心跳。 - Norman Maurer
你能向我展示如何创建一个适合Netty异步模型的心跳事件吗? - Dan Tran
1个回答

3

看起来你正在将相同的 io.netty.handler.timeout.ReadTimeoutHandler 实例添加到许多通道中。请尝试:

ch.pipeline()
.addLast(new ReadTimeoutHandler(3000))

@Sharable 文档:

/**
 * Indicates that the same instance of the annotated {@link ChannelHandler}
 * can be added to one or more {@link ChannelPipeline}s multiple times
 * without a race condition.
 * <p>
 * If this annotation is not specified, you have to create a new handler
 * instance every time you add it to a pipeline because it has unshared
 * state such as member variables.
 * <p>
 * This annotation is provided for documentation purpose, just like
 * <a href="http://www.javaconcurrencyinpractice.com/annotations/doc/">the JCIP annotations</a>.
 */
@Inherited
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Sharable {
    // no value
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接