问题定时任务在突然不跑了
同事突然说定时任务在突然不跑了,没有报错日志,项目在近期没有重新部署,日志突然断了,但是事个项目在生产环境是可以正常使用的。
异常诡异!
遇到种问题如果心情低落时,肯定以为是啥妖在作怪,其实还不是代码写得有问题,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、解决方法
网络获取文件都要设置超时连接。