玩转 Spring Boot 集成篇(@Scheduled静态动态定时任务)

Posted 一猿小讲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玩转 Spring Boot 集成篇(@Scheduled静态动态定时任务)相关的知识,希望对你有一定的参考价值。

public static void main(String[] args) SpringApplication.run(DemoApplication.class, args); private static final Log logger = LogFactory.getLog(DownLoadTask.class); @Scheduled(cron = "0 0/5 * * * ?") public void justDoIt() logger.info("开始下载银行对账文件"); logger.info("银行对账文件下载完成,进行解密操作"); logger.info("银行对账文件下载解密完成"); private static final Log logger = LogFactory.getLog(DownLoadTask.class); @Scheduled(cron = "0/1 * * * * ?") public void justDoItA() logger.info("开始下载银行 A 的对账文件"); logger.info("银行 A 对账文件下载完成,进行解密操作"); logger.info("银行 A 对账文件下载解密完成"); @Scheduled(cron = "0/1 * * * * ?") public void justDoItB() logger.info("开始下载银行 B 的对账文件"); logger.info("银行 B 对账文件下载完成,进行解密操作"); logger.info("银行 B 对账文件下载解密完成"); @Bean(name = "bankThreadPool") public Executor bankExecutor() ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 设置核心线程数为 3 executor.setCorePoolSize(3); // 最大线程数为10 executor.setMaxPoolSize(10); // 任务队列的大小 executor.setQueueCapacity(3); // 线程前缀名 executor.setThreadNamePrefix("bankExecutor-"); // 线程存活时间 executor.setKeepAliveSeconds(30); // 初始化 executor.initialize(); return executor; private static final Log logger = LogFactory.getLog(DownLoadTask.class); @Async("bankThreadPool") @Scheduled(cron = "0/1 * * * * ?") public void justDoIt() logger.info("开始下载银行 A 的对账文件"); logger.info("银行 A 对账文件下载完成,进行解密操作"); logger.info("银行 A 对账文件下载解密完成"); @Async("bankThreadPool") @Scheduled(cron = "0/1 * * * * ?") public void justDoIt2() logger.info("开始下载银行 B 的对账文件"); logger.info("银行 B 对账文件下载完成,进行解密操作"); logger.info("银行 B 对账文件下载解密完成"); * 动态定时任务实现步骤* 步骤1:定义定时任务 DownLoadTaskV3 类实现 SchedulingConfigurer 接口;* 步骤2:编写定时任务要执行的业务逻辑;* 步骤3:数据库中配置任务执行的具体时间规则,记住任务名称* 步骤4:根据任务名称从数据库获取 Cron 参数,设置任务触发器,触发任务执行。* (仅抛砖引玉,可作进一步的抽象)*/ Log logger = LogFactory.getLog(DownLoadTaskV3.class); TaskInfoRepository taskInfoRepository; Runnable task = Runnable() logger.info( logger.info( logger.info( ; Trigger trigger = Trigger() * 每一次任务触发,都会调用一次该方法 * 然后重新获取下一次的执行时间 */ Date TaskInfo taskInfo = TaskInfo(); taskInfo.setJobName( Optional<TaskInfo> taskInfoOptional = taskInfoRepository.findOne(Example.of(taskInfo)); String cron = taskInfoOptional.get().getCron(); CronTrigger trigger = CronTrigger(cron); trigger.nextExecutionTime(triggerContext); ; taskRegistrar.addTriggerTask(task, trigger); ( AUTO_INCREMENT datetime datetime PRIMARY ((TaskInfo Serializable Integer id; cron; jobName; status; createTime; updateTime; JpaRepository<TaskInfo, Integer>

2.5. 引入依赖以及相关配置


主要是完成从数据库查询指定任务名称对应的定时配置,实现方式会有很多种,不要局限于本文提及的 JPA,可参考历史分享《玩转 Spring Boot 集成篇(MyBatis、JPA、事务支持)引入 JPA、数据库连接依赖以及 application.properties 完成数据库连接配置。

2.6. 运行验证


库中对于 downLoadTaskV3 任务默认配置的时间为每 10 秒执行一次。


控制台输出如下

手动修改数据库,把任务执行的时间表达式修改为每 1 秒执行一次。

控制台输出效果如下,很显然已经生效了。


至此,定时任务的时间就可以动态修改生效了,若再实现一个页面进行修改任务执行时间的值,其实也挺爽。


这种方案其实可以称为是简易版的 Quartz,在一定程度上也能解决一定的业务场景问题,但是若做更复杂的动作,例如启停任务、删除任务等等操作,实现起来则稍显复杂,此时便可以通过集成 Quartz 等开源任务框架来实现,而鉴于集成 Quartz 框架的动态管理任务代码较多咱们下一篇再分享。


3. 例行回顾


本文是 Spring Boot 项目集成定时任务首篇讲解,主要分享了如下部分:

  • Spring Boot 内置注解实现静态定时任务;

  • 提了一嘴四种任务时间配置格式;

  • 分享了如何开启多线程跑任务?

  • 尝试实现了动态定时任务。


  • 玩转 Spring Boot 集成定时任务首篇就写到这里,下次一起集成 Quratz 框架并实现任务动态管理

    一起聊技术、谈业务、喷架构,少走弯路,不踩大坑,会持续输出更多精彩分享,欢迎关注,敬请期待!


    历史系列文章:

    玩转  Spring Boot 入门篇

    玩转 Spring Boot 集成篇(mysql、Druid、HikariCP

    玩转  Spring Boot 集成篇(MyBatis、JPA、事务支持

    玩转  Spring Boot 集成篇(Redis

    玩转 Spring Boot 集成篇(Actuator、Spring Boot Admin

    玩转 Spring Boot 集成篇(RabbitMQ)

    玩转Spring Boot 集成Dubbo

    玩转Spring Boot 集成Dubbo 使用Spring Boot 与Dubbo集成,这里我之前尝试了使用注解的方式,简单的使用注解注册服务其实是没有问题的,但是当你涉及到使用注解的时候在服务里面引用事务,注入其他对象的时候,会有一些问题。于是我就果断放弃了注解了,使用的是XML,这里可能介绍的是Dubbo,但是如果使用Dubbox的话,基本上是兼容的。接下来,将说说使用XML的方式与Spring Boot在一起开发。 1.创建工程在pom.xml中加入依赖 创建工程名为: (1)springboot-dubbo-provide (2)springboot-dubbo-api (3)springboot-dubbo-consume springboot-dubbo-api工程主要是放一些service接口,用于提供给消费者使用 。springboot-dubbo-provide工程用于提供服务。 springboot-dubbo-consume工程为消费者。在springboot-dubbo-provide工程中打开pom.xml加入以下依赖,完整代码如下: [html] view plain copy 4.0.0 com.chengli springboot-dubbo-provide 0.0.1-SNAPSHOT jar springboot-dubbo-provide http://maven.apache.org org.springframework.boot spring-boot-starter-parent 1.4.3.RELEASE UTF-8 1.8 2.5.3 3.4.6 0.1 com.chengli springboot-dubbo-api 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter com.alibaba dubbo org.springframework spring ${com.alibaba.dubbo.version} org.apache.zookeeper zookeeper ${org.apache.zookeeper.version} com.github.sgroschupf zkclient ${com.github.sgroschupf.zkclient.version} org.springframework.boot spring-boot-maven-plugin 打开springboot-dubbo-consume工程,在pom.xml中加入以下依赖,完整代码如下: [html] view plain copy 4.0.0 com.chengli springboot-dubbo-consume 0.0.1-SNAPSHOT jar springboot-dubbo-consume http://maven.apache.org org.springframework.boot spring-boot-starter-parent 1.4.3.RELEASE UTF-8 1.8 2.5.3 3.4.6 0.1 com.chengli springboot-dubbo-api 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-web com.alibaba dubbo org.springframework spring ${com.alibaba.dubbo.version} org.apache.zookeeper zookeeper ${org.apache.zookeeper.version} com.github.sgroschupf zkclient ${com.github.sgroschupf.zkclient.version} org.springframework.boot spring-boot-configuration-processor true org.springframework.boot spring-boot-maven-plugin 2.Dubbo配置 2.1springboot-dubbo-provide服务提供者 (1)在springboot-dubbo-provide项目中创建入口启动类MainConfig,完整代码如下: [java] view plain copy package com.chengli.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MainConfig { public static void main(String[] args) { SpringApplication.run(MainConfig.class, args); try { System.in.read(); } catch (Exception e) { e.printStackTrace(); } } } (2)创建Dubbo配置类 [java] view plain copy package com.chengli.springboot.dubbo; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource("classpath:dubbo/dubbo.properties") @ImportResource({ "classpath:dubbo/*.xml" }) public class DubboConfig { } (3)创建Dubbo配置文件 在src/main/resources下新建文件夹dubbo,并加入以下配置: dubbo-provider.xml内容如下: [html] view plain copy 注意:这里我发布的example服务是示例,具体的根据实际修改 (4)创建dubbo.properties [html] view plain copy #应用名称 dubbo.application.name=example-provider #注册中心类型 dubbo.registry.protocol=zookeeper #注册中心地址 dubbo.registry.address=127.0.0.1:2181 #暴露服务方式 dubbo.protocol.name=dubbo #暴露服务端口 dubbo.protocol.port=20880 2.2springboot-dubbo-consume服务消费者 (1)创建入口启动类MainConfig [java] view plain copy package com.chengli.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MainConfig { public static void main(String[] args) { SpringApplication.run(MainConfig.class, args); } } (2)创建Dubbo配置类 [java] view plain copy package com.chengli.springboot.dubbo; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource("classpath:dubbo/dubbo.properties") @ImportResource({ "classpath:dubbo/*.xml" }) public class DubboConfig { } (3)创建Dubbo配置文件 在src/main/resources下新建文件夹dubbo,并加入以下配置: dubbo-consume.xml内容如下: [html] view plain copy (4)创建dubbo.properties [html] view plain copy #应用名称 dubbo.application.name=example-consume #注册中心类型 dubbo.registry.protocol=zookeeper #注册中心地址 dubbo.registry.address=127.0.0.1:2181 到这里基本上就已经可以了,不过测试类的代码我就不贴上来了。只要在API中定义接口实现即可。使用Spring Boot 与Dubbo集成的时候,需要注意的是,不要使用Spring Boot提供的devtools热启动,因为devtools提供了两个ClassLoader,加载策略问题导致出现错误,无法启动。如果开发中需要热加载,那么使用Spring 提供的springloaded。 有兴趣的朋友可以加群探讨相互学习:

    以上是关于玩转 Spring Boot 集成篇(@Scheduled静态动态定时任务)的主要内容,如果未能解决你的问题,请参考以下文章

    玩转Spring Boot 集成Dubbo

    玩转 Spring Boot 原理篇(源码环境搭建)

    玩转 Spring Boot 原理篇(自动装配源码剖析)

    玩转 Spring Boot 原理篇(核心注解知多少)

    玩转 Spring Boot 入门篇

    玩转 Spring Boot 原理篇(自动装配前凑之自定义Stater)

    (c)2006-2019 SYSTEM All Rights Reserved IT常识