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

使用@EnableScheduling方式

@Component
@Configurable
@EnableScheduling
public class Task1 {
private static Log logger = LogFactory.getLog(Task1.class);
@Scheduled(cron = "0/2 * * * * * ")
public void execute() {
logger.info("Task1>>" + new Date());
}
}

xml配置方式

application启动加入读取xml文件

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

bean创建工厂方式

使用到的jar

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>

新建SchedledConfiguration.java文件

@Configuration
public class SchedledConfiguration { /**
* attention:
* Details:配置定时任务
*/
@Bean(name = "jobDetail")
public MethodInvokingJobDetailFactoryBean detailFactoryBean(Task3 task) {// TestTask为需要执行的任务
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
/*
* 是否并发执行
* 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
* 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
*/
jobDetail.setConcurrent(false); // 设置任务的名字
jobDetail.setName("jobDetailName"); // 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用
jobDetail.setGroup("jobDetailGroup"); /*
* 为需要执行的实体类对应的对象
*/
jobDetail.setTargetObject(task); /*
* 通过这几个配置,告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的task方法
*/
jobDetail.setTargetMethod("task");
return jobDetail;
} /**
* Details:配置定时任务的触发器,也就是什么时候触发执行定时任务
*/
@Bean(name = "jobTrigger")
public CronTriggerFactoryBean cronJobTrigger(JobDetail jobDetail) {
CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
tigger.setJobDetail(jobDetail);
// 初始时的cron表达式,可以改成从数据库中获取
tigger.setCronExpression("0/2 * * * * ?");
// trigger的name
tigger.setName("tiggerName");
return tigger; } /**
* Details:定义quartz调度工厂
*/
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(Trigger trigger) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
bean.setOverwriteExistingJobs(true);
// 延时启动,应用启动1秒后
bean.setStartupDelay(1);
// 注册触发器
bean.setTriggers(trigger);
return bean;
}
}

新建Task任务

@Service
public class Task3 { @Resource(name = "jobTrigger")
private CronTrigger cronTrigger; @Resource(name = "scheduler")
private Scheduler scheduler; private static Log logger = LogFactory.getLog(Task3.class); public void task() {
logger.info("Task3---------" + new Date());
} /**
* 设置cron并重启定时器
* @param cron cron值
*/
public void setCron(String cron) {
try {
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
// 按新的cronExpression表达式重新构建trigger
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(cronTrigger.getKey());
trigger = trigger.getTriggerBuilder().withIdentity(cronTrigger.getKey())
.withSchedule(scheduleBuilder).build();
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(cronTrigger.getKey(), trigger);
} catch (SchedulerException e) {
logger.info("cron表达式错误");
}
}
}

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

ThreadPoolTaskScheduler Runnable方式

public class Task4 implements Runnable {

    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    private static Log logger = LogFactory.getLog(Task4.class);

    @Override
public void run() {
logger.info("Task4================" + new Date());
} /**
* 设置cron并启动
* @param cronExp cron值
*/
public void reStart(String cronExp) {
if (null != this.threadPoolTaskScheduler) {
ScheduledExecutorService scheduledExecutorService = this.threadPoolTaskScheduler.getScheduledExecutor();
if (!scheduledExecutorService.isShutdown()) {
scheduledExecutorService.shutdownNow();
} this.threadPoolTaskScheduler.destroy();
} if (null != cronExp && cronExp.trim().length() > 0) {
this.threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
this.threadPoolTaskScheduler.setThreadNamePrefix("task4");
this.threadPoolTaskScheduler.initialize();
this.threadPoolTaskScheduler.schedule(this, new CronTrigger(cronExp));
}
}
}

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

/**
* 初始化task4
* 这里的代码不应该写在rest层上, 应该写在service层上
*/
@PostConstruct
private void initTask4() {
//初始化task4任务调度器cron,可以从数据库中查询到cron值
setTask4Cron("0/3 * * * * ?");
} /**
* 改变task4的cron
* @param cron cron值
* @return 成功标志
*/
@RequestMapping(value = { "/setTask4Cron" }, method = RequestMethod.GET)
@ResponseBody
public String setTask4Cron(String cron) {
if (null == task4) {
task4 = new Task4();
} task4.reStart(cron);
return "success";
}

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. Dynamic Rankings ZOJ - 2112(主席树+树状数组)

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

  2. python学习day8 文件操作(深度学习)

    文件操作 (day7内容扩展) 1 文件基本操作 obj = open('路径',mode='模式',encoding='编码')obj.write()obj.read()obj.close() 2 ...

  3. Hadoop基础-Hadoop的集群管理之服役和退役

    Hadoop基础-Hadoop的集群管理之服役和退役 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际生产环境中,如果是上千万规模的集群,难免一个一个月会有那么几台服务器出点故 ...

  4. Angular: 执行ng lint后如何快速修改错误

    当我第一次被分配到“修正执行ng lint语句后的错误”这项任务前,我就被导师提前告知这是一个很无聊的任务,当我开始后,我发现其实有一些办法可以加快这个无聊单调的工作.接下来,我就分享一下我的经验. ...

  5. DirectX11--HLSL中矩阵的内存布局和mul函数探讨

    前言 说实话,我感觉这是一个大坑,不知道为什么要设计成这样混乱的形式. 在我用的时候,以row_major矩阵,并且mul函数以向量左乘矩阵的形式来绘制时的确能够正常显示,并不会有什么感觉.但是也有人 ...

  6. springBoot总结

    springBoot总结: ssm基本的依赖: <dependencies> <!--添加依赖thymeleaf 可以访问html页面--> <!--<depend ...

  7. 第一节:.Net版基于WebSocket的聊天室样例

    一. 说在前面的话 该篇文章为实时通讯系列的第一节,基于WebSocket编写了一个简易版聊天样例,主要作用是为引出后面SignalR系列的用法及其强大方便之处,通过这个样例与后续的SignalR对比 ...

  8. $m$ 整除 $10^k$ 的一个充分条件

    若 (1) 既约分数 $\cfrac{n}{m}$ 满足 $0<\cfrac{n}{m}<1$; (2) 分数 $\cfrac{n}{m}$ 可以化为小数部分的一个循环节有 $k$ 位数字 ...

  9. 使用HttpClient和WebRequest时POST一个对象的写法

    [一]步骤: 1)将对象转化为Json字符串. 2)将Json字符串编码为byte数组. 3)设置传输对象(WebRequest或者HttpClient)的ContentType是"appl ...

  10. K-means clustering

    K-means算法是一种迭代算法,步骤如下: 1.随机初始化K个聚类中心u1,u2,...,uk 2.根据每个样本和各个聚类中心的距离给每个样本打上标签(例如,x(i)与u3的距离最小,则x(i)的标 ...