天天看点

quartz卡死

这两天遇到个quartz定时任务卡死的问题,记录如下。

客户端用quartz 写了几个定时任务(HttpURLConnection),去定时 从服务器 同步消息。但运维的兄弟说,重启了服务器,有两个定时任务死了。

查看日志,发现8这一个线程,确实卡死了。其他的则报了请求失败的异常。

quartz卡死

我打开intellij调试,发现无论我如何停止服务,重启服务器后, 客户端都能自动连上。刚开始 我怀疑是HttpURLConnection没有写超时返回,导致的。

从服务器里面,写了个sleep,发现确实不会断线重连,导致卡死。

但想不明白,为什么我这里不能重现。再有如果卡死的话,应该是所有的定时任务都卡死,为什么有的没卡死呢?

后来通过仔细询问,发现运维的重启方式是关机重启,而不是去服务里面重启。仿真了一下,确实卡死了。接下来的的问题,就好分析了。

卡死确实发生在了,HttpURLConnection这。至于为什么有的卡死,有的没卡死,则是因为,卡死的任务,时间间隔短(卡死概率大),未卡死的时间间隔长(卡死概率小)。

HttpURLConnection有两个超时,一个是连接超时,一个是读数据超时。当重启的时候,如果任务已经连接上了,但是读数据时,服务器断开了,就会导致Quartz死等。

如果电脑完全关闭后,客户端的定时任务再触发,就会因为无法连通 包HTTP请求失败,不会导致卡死。

手动设置超时时间,问题解决。

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();

urlCon.setConnectTimeout(30000);

urlCon.setReadTimeout(30000);