基于Netty添加定时任务时,不要使用JDK的ScheduledExecutorService,直接向连接所属的IO线程添加:ctx.executor().schedule(new TimeoutTask(p), 30, TimeUnit.SECONDS)。原因如下:
首先,JDK的ScheduledExecutorService是一个大池子,多线程争抢并发锁。而上面的写法,TimeoutTask只属于当前的EventLoop,没有任何锁。
其次,如果发送成功,需要从长长Queue里找回任务来取消掉它。现在每个EventLoop一条Queue,明显长度只有原来的N分之一。