有没有办法控制网络处理程序的工作时间?

时间:2014-01-03 07:10:39

标签: netty

如果我的处理程序花费太多时间,我希望它尽快返回错误,但现在我的处理程序将一直工作直到完成,所以我的客户端捕获太多的超时异常。我该如何配置我的网络服务器? 我试过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后赶上它,不是吗?

2 个答案:

答案 0 :(得分:0)

您阻止线程,因此之前无法获得通知。这是因为Netty使用这个线程来处理Channel的所有IO。

答案 1 :(得分:0)

一种选择是将处理程序执行的工作传递给非netty线程池。这将释放I / O线程来处理超时事件。

如果处理程序在任何给定时间只处理每个通道一个任务,那么管理任务相对容易。如果任务可以取消,那么只需在超时发生时取消它。如果无法取消,则设置一个标志以在发生超时时抑制响应。

如果处理程序需要同时处理每个通道的多个任务,那么您需要维护一个未完成任务列表,并决定在发生超时时取消哪个任务。

您也可以在单独的事件执行程序中运行处理程序。