Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Netty Comet异步请求超时_Java_Concurrency_Netty - Fatal编程技术网

Java Netty Comet异步请求超时

Java Netty Comet异步请求超时,java,concurrency,netty,Java,Concurrency,Netty,我正在尝试使用Jboss Netty创建长轮询Comet 如何配置30秒以外的时间?下列文件: @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast("decoder", new HttpRequestDecoder()); pipeline.addLas

我正在尝试使用Jboss Netty创建长轮询Comet

如何配置30秒以外的时间?下列文件:

@Override
    public ChannelPipeline getPipeline() throws Exception {
    ChannelPipeline pipeline = Channels.pipeline();
     pipeline.addLast("decoder", new HttpRequestDecoder());
     pipeline.addLast("encoder", new HttpResponseEncoder());
     pipeline.addLast("handler", new HTTPRequestHandler());
     Timer timer = new HashedWheelTimer();
     pipeline.addLast("timeout", new IdleStateHandler(timer, 30, 30, 0));
    return pipeline; 
但它不起作用,我的请求将永远持续下去。如何解决这个问题

这是否意味着我需要实现
Callable
,然后调用
Future.get
和timeout参数,并在发生
TimeOutException
时终止请求?那么我应该使用
Future

还有别的办法吗

代码:

FutureExecutor-executor=FutureExecutor.getInstance();
@凌驾
public void messageReceived(ChannelHandlerContext ctx,MessageEvent e)引发异常{
HttpRequest请求=(HttpRequest)e.getMessage();
ChannelFuture ChannelFuture=null;
Callable myRunnable=新的MyCallable(e);
Future=executor.firevent(myRunnable);
试一试{
channelFuture=future.get(40,时间单位为秒);
}捕获(TimeoutException例外){
channelFuture=e.getChannel(响应超时响应);
//处理超时
}捕获(中断异常例外){
channelFuture=e.getChannel(响应时间间隔响应);
}捕获(ExecutionException ex){
channelFuture=e.getChannel(响应errorResponse);
} 
最后{
future.cancel(true);
channelFuture.addListener(ChannelFutureListener.CLOSE);
}
}
在Callable内部,我只是在监视BlockedQueue:

@Override
public ChannelFuture call() {
        final BlockingQueue<String> queue  =.....
        while (true){
        Message message = queue.take();
                ChannelBuffer partialresponse = ChannelBuffers.buffer(message.toJson());
         ChannelFuture future = e.getChannel().write(partialresponse);
        return future;
        }
}
@覆盖
公共频道未来呼叫(){
最终阻止队列队列=。。。。。
while(true){
Message=queue.take();
ChannelBuffer partialresponse=ChannelBuffers.buffer(message.toJson());
ChannelFuture-future=e.getChannel().write(partialresponse);
回归未来;
}
}

首先,您应该在管道之间共享一个HashedWheelTimer实例,因为它将为每个实例创建一个线程。但现在来谈谈你的问题

如果使用IdleStateHandler,还需要实现IdleStateAwareHandler或IdleStateAwareChannelUpstreamHandler,它将对IdleStateHandler触发的IdleState事件作出反应。因此,例如,如果您希望在通道空闲后断开它的连接,您可以在接收到事件后对其调用Channel.close()

另见:

另一种解决方案是添加ReadTimeoutHandler,然后在exceptionCaught(..)方法中捕获ReadTimeoutException时对其执行操作

见:

首先,您应该在管道之间共享一个HashedWheelTimer实例,因为它将为每个实例创建一个线程。但现在来谈谈你的问题

如果使用IdleStateHandler,还需要实现IdleStateAwareHandler或IdleStateAwareChannelUpstreamHandler,它将对IdleStateHandler触发的IdleState事件作出反应。因此,例如,如果您希望在通道空闲后断开它的连接,您可以在接收到事件后对其调用Channel.close()

另见:

另一种解决方案是添加ReadTimeoutHandler,然后在exceptionCaught(..)方法中捕获ReadTimeoutException时对其执行操作

见:

很好,谢谢。我正在使用实现Async Comet,我为每个监视BlockedQueue的通道都有线程,我的问题是IdleStateAwareChannelUpstreamHandler没有停止线程的工作。很抱歉,我没有得到它。。。即使每个通道使用一个线程,“不”共享HashedWheelTimer也不是一个好主意,因为它会带来一些开销。如果需要从空闲处理中取消线程,则需要提供一种方法来完成此操作。但这更多的是在您的代码范围内,而不是在netty中。我仍然认为你应该避免每个频道使用一个线程…你能告诉我“每个频道使用一个线程”是什么意思吗?如果我正在运行Callable=newcallable(Channel),并且我正在监视我的BlockedQueue,那么我是否在每个通道中使用线程?您说过您在每个通道中使用一个线程。如果您将ChannelFuture存储在BlockedQueue中,这实际上取决于您如何访问它(有多少线程)。我想知道你为什么要这么做。。为什么不直接向ChannelFuture注册一个监听器,一旦注册完成就会收到通知?或者你需要以另一种方式对未来采取行动吗?我想一些示例代码会有所帮助…我只是添加了一些代码,解释了我到底在做什么,我只是在40秒内监视阻塞的队列,如果队列中有什么东西,我会以JSON的形式返回消息,如果队列为空且发生了40秒超时,则返回200 OK,返回空响应。很好,谢谢。我正在使用实现Async Comet,我为每个监视BlockedQueue的通道都有线程,我的问题是IdleStateAwareChannelUpstreamHandler没有停止线程的工作。很抱歉,我没有得到它。。。即使每个通道使用一个线程,“不”共享HashedWheelTimer也不是一个好主意,因为它会带来一些开销。如果需要从空闲处理中取消线程,则需要提供一种方法来完成此操作。但这更多的是在您的代码范围内,而不是在netty中。我仍然认为你应该避免每个频道使用一个线程…你能告诉我“每个频道使用一个线程”是什么意思吗?如果我正在运行Callable=newcallable(Channel),并且我正在监视我的BlockedQueue,那么我是否在每个通道中使用线程?您说过您在每个通道中使用一个线程。如果您将ChannelFuture存储在BlockedQueue中,这实际上取决于您如何访问它(有多少线程)。我想知道你为什么要这么做。。为什么不直接向ChannelFuture注册一个监听器,一旦注册完成就会收到通知?或者你需要以另一种方式对未来采取行动吗?我想一些示例代码会有所帮助…我只是添加了一些代码来解释我在做什么exa
@Override
public ChannelFuture call() {
        final BlockingQueue<String> queue  =.....
        while (true){
        Message message = queue.take();
                ChannelBuffer partialresponse = ChannelBuffers.buffer(message.toJson());
         ChannelFuture future = e.getChannel().write(partialresponse);
        return future;
        }
}