2013-02-05 97 views
1

我对如何处理netty(3.6.2.FINAL)和keep-alive = true中的大量连接感到困惑。netty client + keep-alive = true

对于在netty客户机上作为服务器端连接器工作,要对其他服务进行http调用,它希望始终保持连接打开以保持性能(keep-alive = true)。

问题:打开通道的数量存在硬性限制,在尝试打开通道后客户端将挂起。为什么没有例外只是挂起?这是通道超时设置吗?

我似乎无法工作线程内了解的Netty在连接的整体管理方面:

  • 与封闭的读/写客户端的ChannelHandler(HTTP请求/响应),你怎么检测连接池是空的?

  • 处理程序可以接收ChannelEvent,但没有任何关于连接池中可用的总计数(无论如何非常不确定)。如果频道没有打开,那么处理程序是否有理由开始打开一个新的频道,因为它在工作线程中运行?

  • 但是,如果连接池耗尽,你将如何去清理一些空闲连接(在处理程序中)?

回答

0

我不得不彻底撕开我的处理程序,让客户端阻止呼叫在没有挂起的情况下工作。这个问题主要通过在处理程序中不保持本地通道引用来解决。

现在我们只需将ConnectionInterface#openConnection()[返回一个新的ChannelFuture]传递给共享自定义ChannelHandler#调用(ConnectionInterface connectionInterface,HttpRequest请求)即可。

更好地在处理程序调用方法中打开通道,并在channel.write(x)之前传递该通道并检查其状态,如果!channel.isWritable()然后回收该通道(从新客户端连接例如ConnectionInterface#openConnection())并重试写入。甚至不需要关闭频道(它可以在游泳池中处理)。

刚刚运行500线程/ 5000请求,它成功罚款。