概述
这两天遇到个quartz定时任务卡死的问题,记录如下。
客户端用quartz 写了几个定时任务(HttpURLConnection),去定时 从服务器 同步消息。但运维的兄弟说,重启了服务器,有两个定时任务死了。
查看日志,发现8这一个线程,确实卡死了。其他的则报了请求失败的异常。
我打开intellij调试,发现无论我如何停止服务,重启服务器后, 客户端都能自动连上。刚开始 我怀疑是HttpURLConnection没有写超时返回,导致的。
从服务器里面,写了个sleep,发现确实不会断线重连,导致卡死。
但想不明白,为什么我这里不能重现。再有如果卡死的话,应该是所有的定时任务都卡死,为什么有的没卡死呢?
后来通过仔细询问,发现运维的重启方式是关机重启,而不是去服务里面重启。仿真了一下,确实卡死了。接下来的的问题,就好分析了。
卡死确实发生在了,HttpURLConnection这。至于为什么有的卡死,有的没卡死,则是因为,卡死的任务,时间间隔短(卡死概率大),未卡死的时间间隔长(卡死概率小)。
HttpURLConnection有两个超时,一个是连接超时,一个是读数据超时。当重启的时候,如果任务已经连接上了,但是读数据时,服务器断开了,就会导致Quartz死等。
如果电脑完全关闭后,客户端的定时任务再触发,就会因为无法连通 包HTTP请求失败,不会导致卡死。
手动设置超时时间,问题解决。
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000);
最后
以上就是友好香水为你收集整理的quartz卡死的全部内容,希望文章能够帮你解决quartz卡死所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复