netty client + keep-alive = true

时间:2013-02-05 01:37:09

标签: http asynchronous client netty

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

对于作为服务器端连接器的netty客户端工作,对另一个服务进行http调用,它希望始终保持连接打开性能(keep-alive = true)。

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

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

  • 使用阻塞写/读客户端ChannelHandler(http请求/响应),如何检测连接池是否为空?

  • 处理程序可以接收ChannelEvent,但没有关于连接池中可用的总计数(无论如何都是非常不确定的)。如果通道未打开,那么处理程序在工作线程中运行时是否有意义启动打开新通道?

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

1 个答案:

答案 0 :(得分:0)

我不得不完全撕掉我的处理程序,让客户端阻止调用工作而不会挂起。问题主要是通过不在处理程序中保留本地通道引用来解决的。

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

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

只需用500个线程/ 5000个请求运行它就可以了。它成功了。