作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Netty 3.6.6.Final 并尝试为我的处理程序实现写超时,以便在超时时我需要编写特定的响应。此外,我需要取消另一个正在管道中执行(或将要执行)的写响应。
这是我目前的管道:
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(LOGGER,
new HttpServerCodec(),
new MyHttpContentDecoder(),
new IdleStateHandler(timer, 0, 1000, 0, TimeUnit.MILLISECONDS),
handler.get());
}
});
Handler 扩展 IdleStateAwareChannelHandler
并实现 channelIdle
方法,我在其中检查写入超时:
if (e.getState() == IdleState.WRITER_IDLE) {
e.getChannel().write(SOME_RESPONSE).addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) throws Exception {
future.getChannel().close();
}});
}
问题是如果没有发生超时,我如何取消我在 messageReceived
方法中计划的写入。 Netty有没有什么习惯来处理这样的问题?
编辑
通过 ChannelFuture
取消无效。据我了解,大部分时间 write 不会被取消。在我的测试中,它一直都是,即 cancel()
总是返回 false。所以我想以这种方式实现它真的很难。
最后,我将代码更新到最新版本 - 4.0.9.Final(更好的 API)。突然之间,由于写入超时,我收到了回复。这在 3.6.6.Final 中不起作用。
在 4.0.9.Final 中,处理写入超时的代码有点不同,但我总是在超时时得到第二次写入(如果我在下面评论 ctx.writeAndFlush
,那么我正在从channelRead0
):
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent e = (IdleStateEvent) evt;
if (e.state() == IdleState.WRITER_IDLE) {
//the following condition was always false
//(channelFuture is a state variable of my handler for previous write)
if (channelFuture != null && channelFuture.isCancellable()) {
System.out.println("Cancel "+channelFuture.cancel(true));
}
ctx.writeAndFlush(SOME_RESPONSE);
}
}
}
不知道在发生超时时“覆盖”第一次写入尝试是否是正确的方法,如果有人能解释它为什么有效以及在最新版本中关于这种情况的更改,我们将很高兴。
最佳答案
当消息被刷新时,promise 被设置为不可取消。一旦消息写出一个字节,就必须将其完整写入,以便解码器可以处理基于流的传输
关于java - 如何在 Netty 中取消写入超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18744981/
我是一名优秀的程序员,十分优秀!