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

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

/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方法就行。只有这样,才能让事务成功执行。

springboot 定时任务相关推荐

  1. SpringBoot定时任务实现的两种方式介绍

    今天给大家介绍SpringBoot定时任务实现的几种方式,希望对大家能有所帮助! 1.SpringTask 用法 框架介绍:SpringTask是Spring自带的轻量级定时任务工具,相比于Quart ...

  2. 开关配置springboot定时任务

    题外话 这是我第五篇原创文章,计划写定时任务内容,想想只要打开自己的有道云笔记,复制粘贴,整理排版一下就能轻松搞定了,这样做有意义吗?自己写文章的价值点是什么呢?考虑了很长时间,主要希望做到一下几点: ...

  3. SpringBoot定时任务(@Scheduled)说明

    转载文章:http://blog.csdn.net/loongshawn/article/details/50663393 1. 定时任务实现方式 定时任务实现方式: Java自带的java.util ...

  4. springBoot 定时任务执行一段时间后失效

    问题描述: springBoot 定时任务执行一段时间后失效,定时任务调用http过一段时间后什么异常也没有 原因:http请求僵死,导致线程也不往下执行,最终导致后面的定时任务也不执行: 解决方法: ...

  5. SpringBoot定时任务简单应用

    SpringBoot定时任务可以用于周期性重复工作的编写,其应用简单,能满足绝大多数需求.在Java中实现定时任务主要有三种实现形式:一是使用JDK 自带的 Timer,二是使用第三方组件 Quart ...

  6. SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)

    最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...

  7. SpringBoot 定时任务的实现

    介绍两种实现方式:配置实现和读取数据库定时任务配置实现. 配置实现比较简单.直接撸代码: package com; import java.util.Properties; import org.ap ...

  8. springboot定时任务未登录情况下获取用户信息报错解决方案

    解决org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling ...

  9. SpringBoot定时任务升级篇(动态添加修改删除定时任务)

    (1)思路说明: (a)首先这里我们需要重新认识一个类ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度. (b)ThreadPoolTaskSchedule ...

  10. Java 实现 Springboot 定时任务(每隔一段时间自动执行一次)

    Java实现非Web项目的Springboot定时任务(每3秒自动执行一次) 前言 一.新建Java Springboot项目 二.示例代码 运行效果 总结 前言 运行非Web的Springboot项 ...

最新文章

  1. Java组合实体模式
  2. Eclipse中,多参列表光标跳转至第2个参数快捷键,及其他常用快捷键
  3. 九、Docker快速搭建Elastic Stack(上篇)
  4. 浅说深度学习(1):核心概念
  5. 測试AtomicInteger与普通int值在多线程下的递增操作
  6. JAVA基础知识(13)-----Lock接口
  7. PAT 乙级 1014. 福尔摩斯的约会 (20) Java版
  8. 定义工作,解读自我——IT帮2019年2月线下活动回顾
  9. lufylegend库 鼠标事件 循环事件 键盘事件
  10. HTML中想要看见盒子的边框,盒子边框装饰
  11. 2017最新xcode打包APP详细图文
  12. MYSQL存储过程的简单运用,包括传值、返回值、返回集合
  13. JAVA 三种方式计算1加到100的结果
  14. 电商购物评论的情感分析
  15. 防火墙互联网的几种接入方式
  16. 开源网络情报(OSINT)定义:对您的企业意味着什么
  17. Chrome插件扩展程序的默认安装目录
  18. 我们真的不需要35岁以上的项目经理吗
  19. 云集品以共享经济为幌子因涉及传销被关闭,做社交电商防止误入
  20. forever warn: --minUptime not set. Defaulting to: 1000ms

热门文章

  1. 将excel中的表快速复制粘贴进word中且不变形
  2. oracle时间相关函数
  3. android 通过sheme打开activity
  4. ConcurrentHashMap中的散列算法有什么含义
  5. js 遍历 JSON数据
  6. 【Linux】 Shell循环
  7. 下载eclipse出现a java_打开Eclipse弹出“No java virtual machine was found...的解决方法
  8. 旁观电子商务——运费之争背后的价格战
  9. 用计算机语言写结婚祝福语,抖音很火的结婚祝福语 祝福新人的唯美句子
  10. redhat linux基础(2)修改主机名,调换网络模式并使用ssh连接,并总结