Java Netty Comet异步请求超时
我正在尝试使用Jboss Netty创建长轮询Comet 如何配置30秒以外的时间?下列文件: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
@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;
}
}