github:https://github.com/chenyingjun/springboot2-task

使用@EnableScheduling方式

  1. @Component
  2. @Configurable
  3. @EnableScheduling
  4. public class Task1 {
  5. private static Log logger = LogFactory.getLog(Task1.class);
  6. @Scheduled(cron = "0/2 * * * * * ")
  7. public void execute() {
  8. logger.info("Task1>>" + new Date());
  9. }
  10. }

xml配置方式

application启动加入读取xml文件

  1. @SpringBootApplication
  2. @ImportResource(value = { "classpath:applicationContext*.xml" })
  3. public class Springboot2TaskApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Springboot2TaskApplication.class, args);
  6. }
  7. }
  1. <context:component-scan base-package="com.chenyingjun.task.schedual"></context:component-scan>
  2. <task:scheduler id="appScheduler" pool-size="2" />
  3. <!-- 调整定时任务 -->
  4. <task:scheduled-tasks>
  5. <task:scheduled ref="task2" method="method2" cron="0/10 * * * * ?"/>
  6. </task:scheduled-tasks>
  1. @Service
  2. public class Task2 {
  3. private static Log logger = LogFactory.getLog(Task2.class);
  4. public void method2() {
  5. logger.info("Task2----method2>>>>" + new Date());
  6. }
  7. }

bean创建工厂方式

使用到的jar

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context-support</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework</groupId>
  7. <artifactId>spring-tx</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.quartz-scheduler</groupId>
  11. <artifactId>quartz</artifactId>
  12. <version>2.3.0</version>
  13. </dependency>

新建SchedledConfiguration.java文件

  1. @Configuration
  2. public class SchedledConfiguration {
  3. /**
  4. * attention:
  5. * Details:配置定时任务
  6. */
  7. @Bean(name = "jobDetail")
  8. public MethodInvokingJobDetailFactoryBean detailFactoryBean(Task3 task) {// TestTask为需要执行的任务
  9. MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
  10. /*
  11. * 是否并发执行
  12. * 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
  13. * 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
  14. */
  15. jobDetail.setConcurrent(false);
  16. // 设置任务的名字
  17. jobDetail.setName("jobDetailName");
  18. // 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用
  19. jobDetail.setGroup("jobDetailGroup");
  20. /*
  21. * 为需要执行的实体类对应的对象
  22. */
  23. jobDetail.setTargetObject(task);
  24. /*
  25. * 通过这几个配置,告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的task方法
  26. */
  27. jobDetail.setTargetMethod("task");
  28. return jobDetail;
  29. }
  30. /**
  31. * Details:配置定时任务的触发器,也就是什么时候触发执行定时任务
  32. */
  33. @Bean(name = "jobTrigger")
  34. public CronTriggerFactoryBean cronJobTrigger(JobDetail jobDetail) {
  35. CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
  36. tigger.setJobDetail(jobDetail);
  37. // 初始时的cron表达式,可以改成从数据库中获取
  38. tigger.setCronExpression("0/2 * * * * ?");
  39. // trigger的name
  40. tigger.setName("tiggerName");
  41. return tigger;
  42. }
  43. /**
  44. * Details:定义quartz调度工厂
  45. */
  46. @Bean(name = "scheduler")
  47. public SchedulerFactoryBean schedulerFactory(Trigger trigger) {
  48. SchedulerFactoryBean bean = new SchedulerFactoryBean();
  49. // 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
  50. bean.setOverwriteExistingJobs(true);
  51. // 延时启动,应用启动1秒后
  52. bean.setStartupDelay(1);
  53. // 注册触发器
  54. bean.setTriggers(trigger);
  55. return bean;
  56. }
  57. }

新建Task任务

  1. @Service
  2. public class Task3 {
  3. @Resource(name = "jobTrigger")
  4. private CronTrigger cronTrigger;
  5. @Resource(name = "scheduler")
  6. private Scheduler scheduler;
  7. private static Log logger = LogFactory.getLog(Task3.class);
  8. public void task() {
  9. logger.info("Task3---------" + new Date());
  10. }
  11. /**
  12. * 设置cron并重启定时器
  13. * @param cron cron值
  14. */
  15. public void setCron(String cron) {
  16. try {
  17. // 表达式调度构建器
  18. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
  19. // 按新的cronExpression表达式重新构建trigger
  20. CronTrigger trigger = (CronTrigger) scheduler.getTrigger(cronTrigger.getKey());
  21. trigger = trigger.getTriggerBuilder().withIdentity(cronTrigger.getKey())
  22. .withSchedule(scheduleBuilder).build();
  23. // 按新的trigger重新设置job执行
  24. scheduler.rescheduleJob(cronTrigger.getKey(), trigger);
  25. } catch (SchedulerException e) {
  26. logger.info("cron表达式错误");
  27. }
  28. }
  29. }

其中setCron方法可以进行重新设定任务调度时间

ThreadPoolTaskScheduler Runnable方式

  1. public class Task4 implements Runnable {
  2. private ThreadPoolTaskScheduler threadPoolTaskScheduler;
  3. private static Log logger = LogFactory.getLog(Task4.class);
  4. @Override
  5. public void run() {
  6. logger.info("Task4================" + new Date());
  7. }
  8. /**
  9. * 设置cron并启动
  10. * @param cronExp cron值
  11. */
  12. public void reStart(String cronExp) {
  13. if (null != this.threadPoolTaskScheduler) {
  14. ScheduledExecutorService scheduledExecutorService = this.threadPoolTaskScheduler.getScheduledExecutor();
  15. if (!scheduledExecutorService.isShutdown()) {
  16. scheduledExecutorService.shutdownNow();
  17. }
  18. this.threadPoolTaskScheduler.destroy();
  19. }
  20. if (null != cronExp && cronExp.trim().length() > 0) {
  21. this.threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
  22. this.threadPoolTaskScheduler.setThreadNamePrefix("task4");
  23. this.threadPoolTaskScheduler.initialize();
  24. this.threadPoolTaskScheduler.schedule(this, new CronTrigger(cronExp));
  25. }
  26. }
  27. }

其中reStart可以进行任务启动和重新设置任务调度时间,调用方式如下所示

  1. /**
  2. * 初始化task4
  3. * 这里的代码不应该写在rest层上, 应该写在service层上
  4. */
  5. @PostConstruct
  6. private void initTask4() {
  7. //初始化task4任务调度器cron,可以从数据库中查询到cron值
  8. setTask4Cron("0/3 * * * * ?");
  9. }
  10. /**
  11. * 改变task4的cron
  12. * @param cron cron值
  13. * @return 成功标志
  14. */
  15. @RequestMapping(value = { "/setTask4Cron" }, method = RequestMethod.GET)
  16. @ResponseBody
  17. public String setTask4Cron(String cron) {
  18. if (null == task4) {
  19. task4 = new Task4();
  20. }
  21. task4.reStart(cron);
  22. return "success";
  23. }

initTask4方法加了@PostConstruct'注解,可以在项目启动时自动根据cron来启动任务,setTask4Cron方法可以重新调置任务时间

四个任务的效果如下:

SpringBoot2 task scheduler 定时任务调度器四种方式的更多相关文章

  1. 基于Spring Task的定时任务调度器实现

    在很多时候,我们会需要执行一些定时任务 ,Spring团队提供了Spring Task模块对定时任务的调度提供了支持,基于注解式的任务使用也非常方便. 只要跟需要定时执行的方法加上类似 @Schedu ...

  2. 2. SOFAJRaft源码分析—JRaft的定时任务调度器是怎么做的?

    看完这个实现之后,感觉还是要多看源码,多研究.其实JRaft的定时任务调度器是基于Netty的时间轮来做的,如果没有看过Netty的源码,很可能并不知道时间轮算法,也就很难想到要去使用这么优秀的定时调 ...

  3. 记录对定时任务调度器的小小改进 - API调度计划

    之前记录过一篇 [开源一个定时任务调度器 webscheduler],这是一个看似简单的小工具,昨天部署到服务器上开始试用下,听听反馈. 项目经理看过后,立马反馈说这个使用 Cron表达式 的计划太难 ...

  4. mappers标签引入映射器的四种方式

    第一种方式:mapper标签,通过resource属性引入classpath路径的相对资源 <!-- Using classpath relative resources --> < ...

  5. .net core 2.x - 缓存的四种方式

    其实这些微软docs都有现成的,但是现在的人想对浮躁些,去看的不会太多,所以这里就再记录下 ,大家一起懒一起浮躁,呵呵. 0.基础知识 通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性 ...

  6. android 定位的四种方式

    [原文]  开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面总结了一下网络中现有对于介绍android定位的4种方式,希望对大家有帮助: android 定 ...

  7. 实现web数据同步的四种方式

    http://www.admin10000.com/document/6067.html 实现web数据同步的四种方式 1.nfs实现web数据共享 2.rsync +inotify实现web数据同步 ...

  8. JAVA解析XML的四种方式

    java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...

  9. 解析xml文件的四种方式

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

随机推荐

  1. php中fastcgi和php-fpm是什么东西

    参考和学习了以下文章: 1. mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据 2. 实战Nginx_取代 为了如何一步步的引出fastcgi和php-fpm,我先一点一 ...

  2. VMware下安装linux虚拟机

    安装VMware [下一步] [下一步] 点击[自定义],[下一步] 更改安装目录,[下一步] [下一步] [下一步] [跳过] [完成] 点击桌面图标 如下勾选,输入邮箱,[继续] [完成] 安装l ...

  3. Redis(REmote DIctionary Server)基础

    Redis(REmote DIctionary Server)基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Redis是一个开放源代码(BSD许可)的内存数据结构存储,用作数 ...

  4. openstack项目【day24】:VLAN模式

    本节内容 一 二层基础知识 1.1 vlan介绍 1.1.1:vlan的含义 1.1.2:vlan的类型 1.1.3:vlan的不足 1.2 : 二层交换的基础知识 1.2.1:二层交换机最基本的功能 ...

  5. Java Properties 类读配置文件保持顺序

    前几天,公司项目中有一个需求是读取配置文件的,而且最好能够保证加载到内存中的顺序能够和配置文件中的顺序一致,但是,如果使用 jdk 中提供的 Properties 类的话,读取配置文件后,加载到内存中 ...

  6. EF CodeFirst系列(4)--- 数据注释属性

    EFCodeFirst模式使用的是约定大于配置的编程模式,这种模式利用默认约定根据我们的领域模型建立概念模型.然后我们也可以通过配置领域类来覆盖默认约定. 覆盖默认约定主要用两种手段: 1.数据注释属 ...

  7. 在Spring框架中bean配置文件中constructor-arg标签中没有name元素?

    bean配置文件出现错误的依赖: <beans <beans xmlns="http://www.springframework.org/schema/beans"   ...

  8. Nmpy函数总结

    函数和方法method总览 这是个Numpy函数和方法分类排列目录. 创建数组 arange, array, copy, empty, empty_like, eye, fromfile, fromf ...

  9. 代码,java_web

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 找不多控件, or 控件为null

    组件化开发,命名要使用moudle区分, 同名,在最后合成的时候,会出现很多问题,