springboot 定时任务
创始人
2024-05-19 20:20:18
0

Quartz和springTask区别

在Quartz中,默认所有的定时任务都是并发去执行,无需等到上次任务是否执行完毕。
springtask默认单线程去执行定时任务,需要等待上一次任务执行完毕才会去执行下一个任务(要想让同一时间并发执行,要配线程池)。

springtask组件

创建两个类,MyTask1、MyTask2。比如两个类都有push方法,让两个类的push方法每个五秒中去执行一次。
cron表达式可以在https://cron.qqe2.com/里参考。

/task/MyTask1.java

@Component
public class MyTask1 {private final Logger logger = LoggerFactory.getLogger(MyTask1.class);// @Scheduled注解是Spring Boot提供的用于定时任务控制的注解,表明这是一个需要定时执行的方法@Scheduled(cron = "0/5 * * * * ?")// 每隔五秒钟去执行一次这个方法public void push() {// 在这个方法里面定时的去推送消息logger.info("执行定时任务MyTask1"+Thread.currentThread().getName());//打印线程名称}
}

/task/MyTask2.java

@Component
public class MyTask2 {private final Logger logger = LoggerFactory.getLogger(MyTask2.class);@Scheduled(cron = "0/5 * * * * ?")public void push() {logger.info("执行定时任务MyTask2"+Thread.currentThread().getName());//打印线程名称}
}

另外,启动类需要加上注解 @EnableScheduling,这个注解表示开启定时任务。

启动后可以发现,springtask组件实现的定时任务默认是一个线程同步执行的状态,即第一个任务执行完之后第二个任务才开始执行。

为了解决这个问题,可以使用线程池。
在两个push方法上面加上以在项目中配置好的线程beanId,比如@Async("threadPoolTaskExecutor")。以及启动类加注解@EnableAsync,表示开启线程池的异步执行。

执行定时任务MyTask1 test-thread1
执行定时任务MyTask2 test-thread2
执行定时任务MyTask1 test-thread3 // 五秒后...
执行定时任务MyTask2 test-thread4 // 五秒后...
...

如果springtask与线程池一起使用的话,可以让定时任务同一时间内异步执行。

如果开发环境和线上环境的定时时间不一样的话,可以在各环境配置文件里配置不同的值,在push方法里引入配置项就行。

Quartz组件

pom.xml

org.springframework.bootspring-boot-starter-quartz

/quartz/QuartzTaks1.java

public class QuartzTaks1 extends QuartzJobBean{private final Logger logger = LoggerFactory.getLogger(QuartzTaks1.class);@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {// 执行定时任务logger.info("定时任务QuartzTaks1" + Thread.currentThread().getName());}
}

/quartz/QuartzTaks2.java

public class QuartzTaks2 extends QuartzJobBean{private final Logger logger = LoggerFactory.getLogger(QuartzTaks2.class);@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {// 执行定时任务logger.info("定时任务QuartzTaks2" + Thread.currentThread().getName());}
}

/quartz/JobConfig.java

@Configuration
public class JobConfig {@Beanpublic JobDetail quartzTaks1JobDetail() {// 任务实例(JobDetail)//表示去启动QuartzTaks1定时任务,并给他一个标识,比如类名。withIdentity:任务的名称(唯一实例)return JobBuilder.newJob(QuartzTaks1.class).withIdentity(QuartzTaks1.class.getName()).build();}// 创建调度器(trigger是触发器,任务何时运行、运行几次,它说了算。)@Beanpublic Trigger quartzTrigger() {CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ? ");return TriggerBuilder.newTrigger().forJob(QuartzTaks1.class.getName()).withSchedule(cronScheduleBuilder).storeDurably() //表示开启任务持久化.build();}@Beanpublic JobDetail quartzTaks2JobDetail() {//表示去启动QuartzTaks1定时任务,并给他一个标识return JobBuilder.newJob(QuartzTaks2.class).withIdentity(QuartzTaks2.class.getName()).build();}// 创建调度器@Beanpublic Trigger quartzTrigger() {CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ? ");return TriggerBuilder.newTrigger().forJob(QuartzTaks2.class.getName()).withSchedule(cronScheduleBuilder).storeDurably() //表示开启任务持久化.build();}
}

运行之后,可以看到每个五秒输出信息:

定时任务QuartzTaks2:QuartzSchedule_Worker-1
定时任务QuartzTaks1:QuartzSchedule_Worker-2
定时任务QuartzTaks2:QuartzSchedule_Worker-3 // 五秒后
定时任务QuartzTaks1:QuartzSchedule_Worker-4 // 五秒后
...

可以看到两个定时任务并发执行,线程名称也都不一样。

需要注意的是,MyTask1类的定时任务方法上(push)加@Transactional的话,会导致事务失效,正确的做法应该是将把多表操作的代码放到service里面去,比如放在test方法里面,然后把@Transactional加到service的test方法上,在push方法上去调用service的test方法就行。只有这样,才能让事务成功执行。

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...