Java:定时任务无法正常执行(scheduling + ShedLock)


一、场景

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

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java定时任务调度是一种在预定时间间隔内自动执行特定任务的机制。在Java中,有多种方式可以实现定时任务调度,其中常用的有Timer类、Spring框架的@Scheduled注解以及ScheduledExecutorService接口。 1. 使用Timer类实现定时任务调度的示例代码如下: ```java import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class MyTimerTask { public static void main(String[] args) { // 定义一个任务 TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println("打印当前时间:" + new Date()); } }; // 计时器 Timer timer = new Timer(); // 开始执行任务 (延迟1000毫秒执行,每3000毫秒执行一次) timer.schedule(timerTask, 1000, 3000); } } ``` 2. 使用Spring框架的@Scheduled注解实现定时任务调度的示例代码如下: ```java import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component // 把此类托管给Spring,不能省略 public class TaskUtils { // 添加定时任务 @Scheduled(cron = "30 40 23 005") // cron表达式:每周一23:40:30执行 public void doTask() { System.out.println("我是定时任务~"); } } ``` 3. 使用ScheduledExecutorService接口实现定时任务调度的示例代码如下: ```java import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class MyScheduledExecutorService { public static void main(String[] args) { // 创建任务队列10为线程数量 ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10); // 执行任务 scheduledExecutorService.scheduleAtFixedRate(() -> { System.out.println("打印当前时间:" + new Date()); }, 1, 3, TimeUnit.SECONDS); // 1s后开始执行,每3s执行一次 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值