之前公司项目使用的xxljob是旧版本的2.1.0版本,经常出现在凌晨的时候调度定时任务时,无法调度执行器,导致任务执行失败。经过研究源码分析,发现是因为链接缺少心跳检测导致。
旧版本2.1.0的xxljob(对应的xxl-rpc为1.4.0)使用功能的netty没有增加心跳检测机制,如果调度中心与调度器之间存在负责均衡LB中间件,会出现请求超时的情况。因为LB中间件与两端连接时,如果空闲到一定时间则会主动断掉连接,导致另外一端还复用原连接出现通讯失败。需要升级xxljob版本或者改造netty的使用增加心跳检测保持存活:
NettyHttpConnectClient、NettyHttpClientHandler (客户端设置心跳空闲时间,在这个时间段出现空闲则主动发送心跳)
NettyHttpServer、NettyHttpServerHandler (服务端设置心跳*3的空闲时间,如果在这个时间段出现空闲则主动断开连接)
附加:客户端不用增加主动断开的处理,是因为发送心跳的时候如果连接有问题则会报错自动关闭。服务端则在指定时间内没收到心跳主动断开连接。
问题描述和处理:https://github.com/xuxueli/xxl-job/issues/1026
心跳检测问题,在xxl-rpc在1.4.2版本进行了修复,使用2.1.1版本的xxljob即可(对应的xxl-rpc为1.5.0)。