如果我的处理程序花费太多时间,我希望它尽快返回错误,但现在我的处理程序将一直工作直到完成,所以我的客户端捕获太多的超时异常。我该如何配置我的网络服务器? 我试过ReadTimeoutHandler和WriteTimeoutHandler,但它没有帮助?怎么用? 我的代码是这样的:
p.addLast("idleStateHandler", new IdleStateHandler(1, 1, 1, TimeUnit.SECONDS));
p.addLast("readTimeoutHandler", new ReadTimeoutHandler(1, TimeUnit.SECONDS));
p.addLast("writeTimeoutHandler", new WriteTimeoutHandler(1, TimeUnit.SECONDS));
p.addLast("handler", new myHandler());
我的处理程序代码如下:
Thread.sleep(5000);
return "ok";
我想要的是当一个请求到来时,1s之后,我的服务器返回“超时”,但实际上在5s后,它返回“ok”,为什么?如何解决?
我设置了新的ReadTimeoutHandler(1,TimeUnit.SECONDS),但是为什么在5s之后我抓住一个读取超时异常???我应该在1s后赶上它,不是吗?
答案 0 :(得分:0)
您阻止线程,因此之前无法获得通知。这是因为Netty使用这个线程来处理Channel的所有IO。
答案 1 :(得分:0)
一种选择是将处理程序执行的工作传递给非netty线程池。这将释放I / O线程来处理超时事件。
如果处理程序在任何给定时间只处理每个通道一个任务,那么管理任务相对容易。如果任务可以取消,那么只需在超时发生时取消它。如果无法取消,则设置一个标志以在发生超时时抑制响应。
如果处理程序需要同时处理每个通道的多个任务,那么您需要维护一个未完成任务列表,并决定在发生超时时取消哪个任务。
您也可以在单独的事件执行程序中运行处理程序。