1. setMaximumConnectionsPerHost。这个参数在用常见的netty provider和apache provider时根本没有用。官方说Grizzly provider有用。没试过,反正我们没用Grizzly,比较坑。
2. setMaximumConnectionsTotal。超过这个限制时直接报错,根本不是想象中的那样排队,又是一个大坑。真的要限制并发数得用setExecutorService直接设置线程池。
再说线程池ThreadPoolExecutor,有三个关键参数:coreSize,maxSize,queue。
直观理解:平时保持coreSize个线程,多余的任务来了增加线程,增加到maxSize后排队,队列满了后拒绝。超过coreSize的idle线程结束掉。
结果人家根本不是这么设计的。人家是:平时保持coreSize个线程,多余的任务来了排队,队伍满了增加线程,线程到了maxSize后再放不下拒绝。好奇葩的设定。按照这个设定maxSize基本没啥用,因为一般倾向于把队列放得比较大,防止任务被拒绝。
程序跑了好久,今天并发上来出了bug,深挖一下被雷到了。