一、场景
1、使用定时任务(scheduling
) + 分布式锁(ShedLock
)定期执行一段代码
2、configureTasks()
对于任务执行周期的更新是正常的
3、但任务方法
无法被执行
二、代码片段
三、排查
1、确认Trigger没有问题
2、查看redis,看是不是该任务加锁时间还没过
发现该任务的分布式锁确实有问题,加锁时长居然还有14800000秒
代码中加锁时长为:PT30S
(30秒)
redis中的异常过期时间,可能是先前更改服务器日期导致(未验证)
四、原因
ShedLock分布式锁过期时间出现异常
注:如果多个服务的ShedLock分布式锁是同一个,会出现锁资源的竞争情况,只有其中一个服务能正常执行定时任务,其他服务无法执行
五、解决
删除redis中ShedLock异常的分布式锁
六、ShedLock未加锁但定时任务依旧无法执行
相同的代码,但情况不同,在redis并未找到ShedLock分布式锁的情况下,定时任务依旧无法执行
排查
1、查看日志,未发现报错信息
2、查看进程,发现tomcat服务进程还在,排除服务已关闭的可能
3、查看redis,未发现ShedLock分布式锁,排除其他服务占用锁的可能
4、查看tomcat的catalina.out
日志,发现服务启动一段时间后,因为nio端口冲突实际上已经停止运行了,但tomcat进程还在
,第2步反馈信息不准确
解决
更改nio端口并重新启动tomcat