文档章节

JavaLib-quartz | 基于Spring Boot Quartz开发的定时任务

冯文议
 冯文议
发布于 2018/07/30 10:33
字数 1154
阅读 69
收藏 1

基于Spring Boot Quartz开发的JavaLib-quartz,目的是帮你快速构建定时任务系统,你可以专心编写你的业务逻辑,而不必关注定时任务具体是如何实现的,他的性能如何,有没有异常以及异常处理,监控等等问题。这些你可以在文档中得知。

快速使用

第1步、添加依赖

    <!-- 测试版需要指定仓库 -->
    <repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>com.github.fengwenyi</groupId>
            <artifactId>JavaLib-quartz</artifactId>
            <version>1.0-gamma</version>
        </dependency>
    </dependencies>

第2步、HelloTask.java

package com.fengwenyi.example.javalib_quartz.start;

import com.fengwenyi.javalib.quartz.QuartzTask;
import org.springframework.stereotype.Component;

/**
 * @author Wenyi Feng
 */
@Component
public class HelloTask extends QuartzTask {
}

第3步、HelloJob.java

package com.fengwenyi.example.javalib_quartz.start;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.util.Date;

/**
 * @author Wenyi Feng
 */
public class HelloJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Hello : " + new Date());
    }
}

第4步、HelloController.java

package com.fengwenyi.example.javalib_quartz.start;

import com.fengwenyi.javalib.quartz.ScheduleBean;
import com.fengwenyi.javalib.quartz.TimeTypeEnum;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * @author Wenyi Feng
 */
@RestController
@RequestMapping("/hello")
public class HelloController {

    @Autowired
    private Scheduler scheduler;

    @Autowired
    private HelloTask helloTask;

    @RequestMapping("/job")
    public boolean job() {
        String jobName = "JOB";
        String triggerName = "TRIGGER";
        ScheduleBean scheduleBean = new ScheduleBean(scheduler, HelloJob.class, jobName, triggerName);
        scheduleBean.setTimeType(TimeTypeEnum.AT_TIME);
        scheduleBean.setAtTime(System.currentTimeMillis() + 1000 * 10); // 10s之后运行
        boolean rs = false;
        try {
            rs = helloTask.start(scheduleBean);
            System.out.println("cTime : " + new Date());
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return rs;
    }

}

第5步、浏览器访问

http://localhost:8080/hello/job

如果看到 true ,那就继续下一步,否则就是出错了,需要去检查错误。

第6步、运行效果

10s后运行效果图

API

名称 方法 参数 返回类型 说明
开启定时任务 start (ScheduleBean) boolean 开启是否成功,true:成功,false:失败
定时任务当前状态 status - boolean 定时任务当前状态,true:运行中,false:已停止
停止定时任务 stop - boolean 定时任务停止是否成功,true:成功,false:失败

ScheduleBean字段说明

名称 参数 类型 说明
Scheduler scheduler Scheduler Scheduler 对象
编号 id Long -,保留字段
名称 name String -,保留字段
描述 description String -,保留字段
选用类型 timeTime TimeTypeEnum 选用构造Trigger对象类型
job类 clazz Class 定时任务执行的job类
job参数 paramJobMap Map 定时任务执行的job类
job类 paramTriggerMap Map 定时任务执行的job类
cron表达式 cron String cron表达式
时间间隔 time Integer 每隔一段时间执行一次
时间间隔 atTime Long 指定一个时间点执行(毫秒数)
Job名称 jobName String Job名称
Job组 jobGroup String Job组名称
TriggerName triggerName String Trigger名称
Trigger组 triggerGroup String Trigger组名称

TimeTypeEnum

字段说明

字段 类型 说明
code Integer 代码
msg String 说明

值说明

名称 代码 说明
SIMPLE 1 简单的定时任务,每隔一段时间执行一次
AT_TIME 2 指定一个时间点执行(毫秒数[Long])
CRON 3 使用cron表达式(时间点、循环、自定义时间)

wiki

一、需要在Job中注入Service

使用 @Autowired 注解

@Autowired
private DBService dbService;

二、每隔一段时间执行一次

    int time;
    ScheduleBean scheduleBean;
    scheduleBean.setTimeType(TimeTypeEnum.SIMPLE);
    scheduleBean.setTime(time);

三、指定一个时间点执行一次

    long atTime;
    ScheduleBean scheduleBean;
    scheduleBean.setTimeType(TimeTypeEnum.AT_TIME);
    scheduleBean.setAtTime(atTime);

四、通过使用cron表达式执行

    String cron;
    ScheduleBean scheduleBean;
    scheduleBean.setTimeType(TimeTypeEnum.CRON);
    scheduleBean.setCron(cron);

五、参数

    // 将参数放到job中
    Map<String, Object> jobMap;
    ScheduleBean scheduleBean;
    scheduleBean.setParamJobMap(jobMap);

    // 将参数放到trigger中
    Map<String, Object> triggerMap;
    ScheduleBean scheduleBean;
    scheduleBean.setParamTriggerMap(triggerMap);

六、关于在job获取参数

两种思路: 一是通过map的key获取值, 二是通过构造与map的key相同的属性,提供set方法

    // 获取自己的参数
    JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
    jobDataMap.getInt("");
    jobDataMap.getString("");
    jobDataMap.getFloat("");
    jobDataMap.getDouble("");
    JobDataMap triggerDataMap =  context.getTrigger().getJobDataMap();

    // 合并
    // 如果job和trigger的key相同,trigger会覆盖job的值
    JobDataMap dataMap = context.getMergedJobDataMap();

七、在job中获取jobDetail、trigger基础信息

    // 获取jobDetail相关
    JobKey jobKey = context.getJobDetail().getKey();
    jobKey.getName();
    jobKey.getGroup();
    jobKey.getClass().getName();
    // 获取trigger相关
    TriggerKey triggerKey = context.getTrigger().getKey();
    triggerKey.getName();
    triggerKey.getGroup();

八、task目前支持的方法

开启任务:start

查看当前任务状态:status

停止任务:stop

策略

1、优先选用指定方式构造Trigger

2、检查顺序:cron->atTime->simple,执行顺序:simple > atTime > cron 自下而上进行覆盖

资料

【1】 JavaLib-quartz 测试及使用示例代码

【2】 JavaLib-quartz 源码

About Me

    ©author Wenyi Feng

Licensed

   Copyright 2018 Wenyi Feng(xfsy_2015@163.com)

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

© 著作权归作者所有

冯文议
粉丝 11
博文 47
码字总数 47895
作品 0
成都
高级程序员
私信 提问
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
2018/04/19
0
0
springboot 整合quartz (一):基础使用

---layout: blogistop: truetitle: "springboot 整合quartz (一):基础使用"date: 2018-10-09category: springboottags: springboot quartz --- 介绍 Quartz是一个开源的框架,它完全由写成。......

开心的哈士奇
2018/10/11
266
0
springboot中如何做一个开关,启用和停用quartz

使用Spring Boot 2.x 做了一个后台管理系统,集成了Quartz功能,但有些工程需要用到定时任务,有些工程不会用到定时任务,有没有办法做一个设置,能够在用不到定时任务的工程中停用quartz,这...

罗树鹏
2018/11/05
2.6K
8
Spring boot 入门学习7. 使用Quartz和发邮件

版权声明:(谢厂节的博客)博主文章绝大部分非原创,转载望留链接。 https://blog.csdn.net/xundh/article/details/82419484 SpringBoot可以使用XML配置或注解来定义和使用Quartz。 Quartz...

谢厂节
2018/09/05
0
0
renren-security 3.1.0 发布:拿来即用的权限管理系统

采用SpringBoot、MyBatis、Shiro框架,开发的一套权限系统,极低门槛,拿来即用。设计之初,就非常注重安全性,为企业系统保驾护航,让一切都变得如此简单。 具有如下特点: 灵活的权限控制,...

独孤求胜16
2018/01/28
5.1K
8

没有更多内容

加载失败,请刷新页面

加载更多

JAVA CAS单点登录之三:CAS代理模式演练

前言 JAVA CAS单点登录之一:搭建CAS服务器 JAVA CAS单点登录之二:CAS普通模式1演练 代理模式相相对上一节的普通模式,更加复杂了。但配置起来也会稍微有些差别。所谓难者不会,会者不难。如...

彬彬公子
41分钟前
5
0
Webfont 的兼容性问题[持续更新]

本文转载于:专业的前端网站➺Webfont 的兼容性问题[持续更新] 低版安卓手机的 webview 显示不了,另外黑莓手机显示出来是这样: 生成工具: 离线字体生成工具:webfont 在线字体生成平台:ico...

前端老手
46分钟前
4
0
调用链与日志关联的探索式查询

摘要:本文将就Observability中的日志聚合、分布式跟踪及具体应用中结合使用进行展开说明。 一、Observability Observability是一个最近几年开始在监控社区流行的术语。本文将Observability...

宜信技术学院
46分钟前
4
0
Java常见异常处理

异常是Java程序中经常遇到的问题,一个异常就是一个Bug,就要花很多时间来定位异常。 Java异常 (1)Throwable是Java异常的顶级类,所有的异常都继承于这个类。 (2)Error,Exception是异常...

daxiongdi
今天
4
0
Validator 常用注解

说明 Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数字的,等等。那么在spring boot怎么使用这么强大的校验框架呢。 常用 [@null](https:...

五彩的颜色
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部