Spring Java scheduler定时任务突然不执行的终极解决方法

问题定时任务在突然不跑了

同事突然说定时任务在突然不跑了,没有报错日志,项目在近期没有重新部署,日志突然断了,但是事个项目在生产环境是可以正常使用的。

异常诡异!

遇到种问题如果心情低落时,肯定以为是啥妖在作怪,其实还不是代码写得有问题,gi

解决思路:

工作遇到的问题,spring 的定时任务默认是单线程的,定时任务突然不跑了肯定是某个定时任务卡死了,所以别的任务都无法执行了。

可以参考下面的步骤解决:

1、先将定时任务配置成多线程

只是临时处理,依然会有卡死的风险。

2、查出Bug,永久修复

按照我的理解,每个开发水平不一样,耗时,而且会不断出现。

1、先将定时任务配置成多线程

因为项目是老的所以这里是拿xml来配置,yml的可以自己网上查,一大堆。

    <task:annotation-driven scheduler="myTask" />
     <!-- 3.配置定时任务的线程池 -->
    <task:scheduler id="myTask" pool-size="5"/>
    <!-- 配置执行的类 -->
    <context:component-scan base-package="com.xxxxx.wms.comm.xxxxx"/>

2、查出Bug,永久修复

注意:下面的步骤要在情况出现的情况下执行,要不然有可能找不到。

1、进入生产环境Linux,需要有jstack工具的JDK.

先看一下生产环境下项目是哪个进程在跑,这个懂点维护都不知道怎么查:例如ps -ef|grep xxxx

2、ps p 28364-L -o pcpu,pid,tid,time,tname,cmd

 查看一下当前在跑什么任务。

3、将正在执行的代码片段输出到文件

./jstack -l 28364 >> javal02.log

4、分析正在跑的文件

这里只要查找配置的定时任务名就会找到,对应的代码版,因为程序卡住了。

例如:FlightTrainTask.java,找到的代码片断如下

"pool-1331-thread-1" #116525 prio=5 os_prio=0 tid=0x00007f1641395800 nid=0x60ac runnable [0x00007f1629b32000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
	at java.net.SocketInputStream.read(SocketInputStream.java:171)
	at java.net.SocketInputStream.read(SocketInputStream.java:141)
	at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
	at sun.security.ssl.InputRecord.read(InputRecord.java:503)
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
	- locked <0x00000007412603e0> (a java.lang.Object)
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
	- locked <0x00000007412603a0> (a java.lang.Object)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1546)
	- locked <0x0000000741260fa0> (a sun.net.www.protocol.https.DelegateHttpsURLConnection)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
	- locked <0x0000000741260fa0> (a sun.net.www.protocol.https.DelegateHttpsURLConnection)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
	- locked <0x0000000741260f48> (a sun.net.www.protocol.https.HttpsURLConnectionImpl)
	at java.net.URL.openStream(URL.java:1045)
	at org.apache.commons.io.FileUtils.copyURLToFile(FileUtils.java:1460)
	at com.xxxx.wms.reportclient.util.ExcelUtil.saveLabel(ExcelUtil.java:544)
	at com.xxxx.wms.busbase.util.DeYunUtil.getTrackingAndLabel(DeYunUtil.java:322)
	at com.xxxx.wms.busclient.service.impl.OutboundServiceImpl.synchronizeOutboundTracking(OutboundServiceImpl.java:6983)
	at sun.reflect.GeneratedMethodAccessor4380.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy300.synchronizeOutboundTracking(Unknown Source)
	at com.xxxx.wms.comm.timetask.FlightTrainTask.synchronizeOutboundTracking(FlightTrainTask.java:353)
	at sun.reflect.GeneratedMethodAccessor4379.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
	at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
	at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
	- <0x000000070cd2a0f0> (a java.util.concurrent.ThreadPoolExecutor$Worker)

找到卡住的位置:

ExcelUtil类的saveLabel方法代码行数是544.

 

5、查看卡住的代码

org.apache.commons.io.FileUtils

FileUtils.copyURLToFile(new URL(label), file);

这里的文件是从网络上取的,而且直接使用了apache的工具类,但是此工具类并没有设置超时时间,然后就一直卡在这里。

6、解决方法

 网络获取文件都要设置超时连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值