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

只要跟需要定时执行的方法加上类似 @Scheduled(cron = "0 1 * *  *  *") 的注解就可以实现方法的定时执行。

cron 是一种周期的表达式,六位从右至左分别对应的是年、月、日、时、分、秒,数字配合各种通配符可以表达种类丰富的定时执行周期。

/**
* Cron Example patterns:
* <li>"0 0 * * * *" = the top of every hour of every day.</li>
* <li>"0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.</li>
* <li>"0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.</li>
* <li>"0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays</li>
* <li>"0 0 0 25 12 ?" = every Christmas Day at midnight</li>
*/

基于注解的使用案列:

import org.springframework.stereotype.Component; 

@Component(“task”)
public class Task {
@Scheduled(cron = "0 1 * * * *") // 每分钟执行一次
public void job1() {
System.out.println(“任务进行中。。。”);
}
}

基于注解方式的定时任务,启动会依赖于系统的启动。如果需要通过代码或前台操作触发定时任务,就需要进行包装了。

下面是一个可以直接提供业务代码调用的定时任务调度器。调用 schedule(Runnable task, String cron) 传入要执行的任务

task和定时周期cron就可以了。注:基于注解方式需要在注解扫描范围内。

package com.louis.merak.schedule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component; @Component
public class MerakTaskScheduler { @Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler; @Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
return new ThreadPoolTaskScheduler();
} /**
* Cron Example patterns:
* <li>"0 0 * * * *" = the top of every hour of every day.</li>
* <li>"0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.</li>
* <li>"0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.</li>
* <li>"0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays</li>
* <li>"0 0 0 25 12 ?" = every Christmas Day at midnight</li>
*/
public void schedule(Runnable task, String cron){
if(cron == null || "".equals(cron)) {
cron = "0 * * * * *";
}
threadPoolTaskScheduler.schedule(task, new CronTrigger(cron));
} /**
* shutdown and init
* @param task
* @param cron
*/
public void reset(){
threadPoolTaskScheduler.shutdown();
threadPoolTaskScheduler.initialize();
} /**
* shutdown before a new schedule operation
* @param task
* @param cron
*/
public void resetSchedule(Runnable task, String cron){
shutdown();
threadPoolTaskScheduler.initialize();
schedule(task, cron);
} /**
* shutdown
*/
public void shutdown(){
threadPoolTaskScheduler.shutdown();
}
}

如果是需要通过前台操作调用RESTful执行定时任务的调度,使用以下Controller即可。

package com.louis.merak.common.schedule;

import java.text.SimpleDateFormat;
import java.util.Date; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; @RestController
public class MerakTaskSchedulerController { @Autowired
MerakTaskScheduler taskScheduler; @RequestMapping("/schedule")
public String schedule(@RequestParam String cron) {
     if(cron == null) {
       cron = "0/5 * * * * *";
}
        Runnable runnable = new Runnable() {
public void run() {
String time = new SimpleDateFormat("yy-MM-dd HH:mm:ss").format(new Date());
System.out.println("Test GETaskScheduler Success at " + time);
}
};
taskScheduler.schedule(runnable, cron);
return "Test TaskScheduler Interface.";
}
}

作者:朝雨忆轻尘
出处:https://www.cnblogs.com/xifengxiaoma/
版权所有,欢迎转载,转载请注明原文作者及出处。

基于Spring Task的定时任务调度器实现的更多相关文章

  1. SpringBoot2 task scheduler 定时任务调度器四种方式

    github:https://github.com/chenyingjun/springboot2-task 使用@EnableScheduling方式 @Component @Configurabl ...

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

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

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

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

  4. spring任务执行器与任务调度器(TaskExecutor And TaskScheduler)

    对于多线程及周期性调度相关的操作,spring框架提供了TaskExecutor和TaskScheduler接口为异步执行和任务调度.并提供了相关实现类给开发者使用.(只记录采用注解的使用形式,对于X ...

  5. 基于spring的quartz定时框架,实现简单的定时任务功能

    在项目中,经常会用到定时任务,这就需要使用quartz框架去进行操作. 今天就把我最近做的个人主页项目里面的定时刷新功能分享一下,很简单. 首先需要配置一个配置文件,因为我是基于spring框架的,所 ...

  6. 开源一个定时任务调度器 webscheduler

    在企业应用中定时任务调度的需求是必不可少的,比如定时同步数据,定时结转数据,定时检测异常等等.公司之前是在使用一款采用.net 开发的windows服务形式的定时程序,基本能满足需求,在一段时间的时候 ...

  7. 基于Redis实现分布式定时任务调度

    项目开发过程中,难免会有许多定时任务的需求进来.如果项目中还没有引入quarzt框架的情况下,我们通常会使用Spring的@Schedule(cron="* * * * *")注解 ...

  8. spring task 实现定时执行(补充:解决定时任务执行2次问题)

    首先在spring-mvc.xml配置头文件引入: xmlns:task="http://www.springframework.org/schema/task" 其次引入task ...

  9. spring中的定时任务调度用例

    在application-quartz.xml配置文件中添加如下配置信息: <!-- Quartz -->     <bean id="getSendEmailObject ...

随机推荐

  1. java基础-day4

    第04天 java基础语法 今日内容介绍 u Random u 数组 第1章   Random 1.1      产生整数随机数 1.1.1    Random的使用步骤 我们想产生1~100(包含1 ...

  2. java web渲染器

    渲染就是server端将夹杂有脚本语言变量对象的模版文件解释为纯html页面的过程!

  3. 曲演杂坛--HASH的一点理解

    HASH,百度百科上做如下定义: Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列 ...

  4. 爬虫浅谈一:一个简单c#爬虫程序

    这篇文章只是简单展示一个基于HTTP请求如何抓取数据的文章,如觉得简单的朋友,后续我们再慢慢深入研究探讨. 图1: 如图1,我们工作过程中,无论平台网站还是企业官网,总少不了新闻展示.如某天产品经理跟 ...

  5. vs 生成事件 +版本号+sed.exe

    set ASMINFO=Properties\AssemblyInfo.csFINDSTR /C:"[assembly: AssemblyVersion(" %ASMINFO% | ...

  6. 徒手画个disk不容易啊。。。

    static const GLfloat disk_vertex_buffer_data[] = { // quarter 1 0.0f, 0.0f, -1.0f, 0.707f, 0.0f, -0. ...

  7. From Alpha to Gamma (I)

    What we think of as conventional alpha-blending is basically wrong. --Tom Forsyth 前段时间在Amazon上淘的三本二手 ...

  8. 安装 rabbitmq ,通过生成器获取redis列表数据 与 Celery 分布式异步队列

    一.安装rabbitmq  @全体成员 超简易安装rabbitmq文档 1.安装配置epel源rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/ ...

  9. hdoj1072 Nightmare(bfs)

    题目大意: 在迷宫中有一个炸弹,过六个单位时间就会爆炸,要你求一个起点到迷宫的终点的最短距离,迷宫中有时间重置器,当你走到这个格子,炸弹的爆炸时间重新置为0,迷宫中标识为墙壁的格子不能走,到达任意一个 ...

  10. IdentityServer4登陆中心

    1. 使用Vsual Studio Code 终端执行 dotnet new webapi --name IdentityServerSample 命令创建一个webapi 的 IdentitySer ...