前言

Quartz是一个定时任务框架,即可以在程序运行期间,定时定期的做出些什么事情,比如发邮件,重启机器,清除缓存等等。

java.util.Timer也可以做到这些功能,但是Quartz框架毕竟是框架,比java自带的定时工具要强大很多。初次体验对于具体细节还不太清楚,目前主要先学会使用,更深入的要等有具体场景具体需求了再深入了解。

使用java.util.Timer

因为对定时任务不熟悉,所以我先使用了一下 Timer 这个java自带的定时任务工具。

import java.util.Date;import java.util.Timer;import java.util.TimerTask;/** * @author 拽小白 * @create 2020-07-18-53 */public class TimerTest {    // 一个简单的demo,每2秒就打印一行 123    public static void main(String[] args) {        Timer timer = new Timer();        timer.scheduleAtFixedRate(new TimerTask() {            @Override            public void run() {                System.out.println("123");            }        }, new Date(), 2000);    }}

‍从这个简单的demo中可以看出来使用Timer只需要创建一个Timer对象,然后使用Timer的scheduleAtFixedRate()方法,放入一个TimeTask匿名内部类并实现里面的run方法和想要间隔的时间就可以完成这个定时任务了。

当然也可以以其他的形式完成所需的形式的定时任务,只要改变所使用的Timer构造方法和启动定时的方法就可以了,具体参考jdk的api文档。

使用Quartz

使用了java自带的定时工具Timer之后,我对定时任务有了个大概的了解,于是开始上手Quartz,在csdn上找到了一个入门小demo。

import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Random;/** * @author 拽小白 * @create 2020-07-18-07 */public class PrintWordsJob implements Job {    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {        //System.out.println(jobExecutionContext.getJobDetail().getJobDataMap().get("msg"));        //System.out.println(jobExecutionContext.getTrigger().getJobDataMap().get("trigger1"));        String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());        System.out.println("PrintWordsJob start at: " + printTime + ", prints: Hello Job-" + new Random().nextInt(100));        System.out.println("==================================================");    }}
import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;import java.util.concurrent.TimeUnit;/** * @author 拽小白 * @create 2020-07-18-10 */public class MyScheduler {    public static void main(String[] args) throws SchedulerException, InterruptedException {        SchedulerFactory schedulerFactory = new StdSchedulerFactory();        Scheduler scheduler = schedulerFactory.getScheduler();        JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class).withIdentity("job1", "group1").usingJobData("msg", "这是一个测试job").build();        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")                .usingJobData("trigger1", "这是一个测试trigger")                .startNow() //立即生效                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())                .build();        scheduler.scheduleJob(jobDetail, trigger);        System.out.println("-----------scheduler start!!------------");        scheduler.start();        //主线程睡眠1分钟        TimeUnit.MINUTES.sleep(1);        scheduler.shutdown();        System.out.println("-----------scheduler shutdown!!------------");    }}

从这个小demo中可以大致看出来一个Quartz启动需要 SchedulerJobTrigger。第一段代码很明显是用来描述定时任务的即 Job,它实现了 org.quartz.Job接口,这个接口里只有一个 public void execute(JobExecutionContext jobExecutionContext)方法,所要完成的任务的内容就是在这里面写。参数 jobExecutionContext根据字面意思可以得知这是一个job执行的上下文,包含了Quartz运行时的环境以及Job本身的详细数据信息,所以:

System.out.println(jobExecutionContext.getJobDetail().getJobDataMap().get("msg"));System.out.println(jobExecutionContext.getTrigger().getJobDataMap().get("trigger1"));JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class).usingJobData("msg", "这是一个测试job").build();SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")                .usingJobData("trigger1", "这是一个测试trigger")

这两行代码就是对应第二段代码的usingJobDataJobDataMap实现了JDK的Map接口,所以可以以Key-Value的形式存储数据。

第二段代码就是Scheduler调度触发器Trigger触发Job的过程,这个demo使用的是SimpleTrigger,还有一种CronTrigger,SimpleTrigger只能定间隔时间,但是CronTrigger可以定启动时间、关闭时间、时间间隔等,功能要比SimpleTrigger强大

CronTrigger是基于Cron表达式的。Cron表达式由7个子表达式组成字符串,格式如下:

[秒][分][小时][日][月][周][年]

举个栗子:* 30 10 ?* 1/5 *   [指定年份] 的 [周一到周五][不指定日][上午10时][30分][指定秒]   00 00 00 ?* 10,11,12 1#5 2018   表示   2018年的10、11、12月的第一周的星期五这一天的0时0分0秒去执行任务。Cron表达式太复杂,所以可以通过在线生成Cron表达式的工具来生成自己想要的表达式:http://cron.qqe2.com/

在spring里使用Quartz

通过简单的使用Quartz,我知道了Quartz主要是三个部分:Scheduler、Trigger、Job,但是在项目中一般都会与spring框架进行整合,所以我又去找了一些关于spring整合Quartz的博客进行了学习。

spring整合Quartz非常简单,只要导入相关jar包然后加上一些配置就好了。毕竟最主要的代码是Job的实现。

关于Job的实现,有两种,一种是继承 org.springframework.scheduling.quartz.QuartzJobBean 然后实现 protected void executeInternal(JobExecutionContext jobExecutionContext) 方法,与之前单独使用Quartz的时候实现 org.quartz.Job 接口一样。还有一种是直接编写类和方法。

示例Demo第一步导入所需jar包或添加依赖。

<dependency>    <groupId>org.quartz-schedulergroupId>    <artifactId>quartzartifactId>    <version>2.3.0version>dependency><dependency>    <groupId>org.quartz-schedulergroupId>    <artifactId>quartz-jobsartifactId>    <version>2.3.0version>dependency><dependency>    <groupId>org.springframeworkgroupId>    <artifactId>spring-context-supportartifactId>    <version>5.2.5.RELEASEversion>dependency><dependency>    <groupId>org.springframeworkgroupId>    <artifactId>spring-txartifactId>    <version>5.2.5.RELEASEversion>dependency>

第二步使用上述第二种方法编写Job,即被调度的类和方法。

/** * @author 拽小白 * @create 2020-07-18-48 */public class QuartzJob {    public void doSimpleBusiness() {        System.out.println("---------quartz + 固定时长---------");    }    public void doCronBusiness() {        System.out.println("---------quartz + cron表达式----------");    }}

第三步配置spring的相关配置文件,这里配置了两种JobDetail和Trigger,为的是体现两种方式的Trigger。

<bean id="quartzJob" class="com.study.quartz.QuartzJob"/><bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    <property name="targetObject" ref="quartzJob"/>    <property name="targetMethod" value="doSimpleBusiness"/>bean><bean id="trigger1" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">    <property name="jobDetail" ref="jobDetail1"/>    <-- 每一秒执行一次 -->    <property name="repeatInterval" value="1000"/>bean><bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    <property name="targetObject" ref="quartzJob"/>    <property name="targetMethod" value="doCronBusiness"/>bean><bean id="trigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">    <property name="jobDetail" ref="jobDetail2"/>    <-- 这里的cron表达式是指每5秒执行一次 -->    <property name="cronExpression" value="*/5 * * * * ?"/>bean><bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">    <property name="triggers">        <list>            <ref bean="trigger1"/>            <ref bean="trigger2"/>        list>    property>bean>

第四步查看启动结果。

---------quartz + 固定时长------------------quartz + 固定时长------------------quartz + 固定时长------------------quartz + 固定时长------------------quartz + 固定时长------------------quartz + cron表达式-------------------quartz + 固定时长------------------quartz + 固定时长------------------quartz + 固定时长------------------quartz + 固定时长------------------quartz + 固定时长------------------quartz + cron表达式----------

使用Spring+Quartz完成定时发邮件的功能

定时发邮件的功能无非就是将Job里的内容变成发邮件,而发邮件我使用的是java里的Mail模块,与spring整合一下就好了,就是一些配置的事情。

第一步添加依赖。

<dependency>    <groupId>javax.mailgroupId>    <artifactId>mailartifactId>    <version>1.4.7version>dependency>

第二步在spring里配置好邮件的相关配置。

// properties文件protocol=smtp   // 发邮件所用协议host=smtp.qq.com   // 这里使用的是qq邮箱的服务,要去qq邮箱里开启这个服务,具体操作百度一下mailUsername=*********  // 这里填写你的邮箱,即开通了smtp服务的邮箱mailPassword=*********  // 这里填写密码,即开通smtp服务时会告知一个使用该服务的密码
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">    <property name="protocol" value="${protocol}"/>    <property name="username" value="${mailUsername}"/>    <property name="password" value="${mailPassword}"/>    <property name="host" value="${host}"/>    <property name="javaMailProperties">        <props>            <prop key="mail.smtp.auth">trueprop>        props>    property>bean>

第三步编写Job类和方法,这里我是把发邮件的部分和被调度的方法分开了。

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.mail.javamail.JavaMailSender;import org.springframework.mail.javamail.MimeMessageHelper;import org.springframework.stereotype.Component;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import java.text.SimpleDateFormat;import java.util.Date;/** * @author 拽小白 * @create 2020-07-18-20 */@Component@PropertySource("classpath:spring.properties")public class MailUtil {    @Autowired    private JavaMailSender javaMailSender;    @Value("${mailUsername}")    private String username;    public void sendMail() {        try {            MimeMessage mimeMessage = javaMailSender.createMimeMessage();            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);            helper.setTo("发送到哪里的具体邮箱");            helper.setSubject("邮件的主题");            helper.setText("邮件的内容");            helper.setFrom(new InternetAddress(username, "署名", "UTF-8"));            javaMailSender.send(mimeMessage);            String now = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());            System.out.println("邮件已发送成功!! 现在是:" + now);        } catch (Exception e) {            e.printStackTrace();        }    }}
import com.study.utils.MailUtil;import org.springframework.beans.factory.annotation.Autowired;/** * @author 拽小白 * @create 2020-07-18-55 */public class SendMailJob {    @Autowired    private MailUtil mailUtil;    public void sentMail() {        mailUtil.sendMail();    }}

第四步配置tigger和scheduler。

<bean id="mailJob" class="com.study.quartz.SendMailJob"/><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    <property name="targetObject" ref="mailJob"/>    <property name="targetMethod" value="sentMail"/>bean><bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">    <property name="jobDetail" ref="jobDetail"/>    <property name="repeatInterval" value="10000"/>bean><bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">    <property name="triggers">        <list>            <ref bean="trigger"/>        list>    property>bean> 

第五步查看结果。

喜欢就点个在看再走吧

定时任务_定时任务Quartz入门相关推荐

  1. java定时任务_定时任务最简单的3种实现方法(超好用)

    定时任务在实际的开发中特别常见,比如电商平台 30 分钟后自动取消未支付的订单,以及凌晨的数据汇总和备份等,都需要借助定时任务来实现,那么我们本文就来看一下定时任务最简单的几种实现方式. TOP 1: ...

  2. java 客户端定时任务_定时任务最简单的3种实现方法(超实用)

    定时任务在实际的开发中特别常见,比如电商平台 30 分钟后自动取消未支付的订单,以及凌晨的数据汇总和备份等,都需要借助定时任务来实现,那么我们本文就来看一下定时任务最简单的几种实现方式. TOP 1: ...

  3. 定时任务框架Quartz-(一)Quartz入门与Demo搭建

    一.什么是Quartz 什么是Quartz? Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java. ...

  4. 美年旅游_套餐管理_定时任务组件Quartz

    文章目录 补充上前面没有的配置 先配置这些 2.4. 完善文件上传,Redis存储图片名称 美年旅游_套餐管理_定时任务组件Quartz 4.1. Quartz介绍 Quartz 入门案例 4.2. ...

  5. 定时任务-动态定时任务(springboot+org.quartz)

    添加依赖 <!-- Quartz定时任务 --><dependency><groupId>org.springframework.boot</groupId& ...

  6. Java实现定时任务方法之Quartz

    记录每次学习的过程,总结学习的内容,希望能给到自己和别人帮助. Java实现定时任务方法之Quartz 创建一个job类 任务 public class HelloJob implements Job ...

  7. java se 定时任务_Quartz 定时任务使用 —— 入门简单调用(一)

    Quartz 详细介绍 Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中.它提供了巨大的灵 活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复 ...

  8. dt测试软件的学习心得,无线网络优化dt测试心得_适合新手入门,高手进阶_5年项目经验实战经验.docx...

    无线网络优化DT测试心得_适合新手入门,高手进阶_5年项目经验实战经验 无线网络优化DT测试心得_适合新手入门,高手进阶_5年项目经验实战经验 路测中不常见的问题和个人心得 1.深井子镇投诉测试报告 ...

  9. PHP如何实现定时任务,PHP定时任务方法,最佳解决方案,PHP自动任务处理 自动备份

    PHP如何实现定时任务,PHP定时任务方法,最佳解决方案,PHP自动任务处理 自动备份 参考文章: (1)PHP如何实现定时任务,PHP定时任务方法,最佳解决方案,PHP自动任务处理 自动备份 (2) ...

最新文章

  1. 解决binwalk运行提示缺少LZMA模块
  2. python3教程-终于清楚python3详细教程
  3. IIS不能下载.apk文件
  4. Flow - JS静态类型检查工具
  5. 从头开始,搭建一个正则表达式引擎(一)整体构架、预处理
  6. CSS基础必备盒模型及清除浮动
  7. tkmybatis 子查询_dnssearch 子域名枚举工具
  8. 学习Windows编程遇到的问题
  9. mysql5.7 存储二进制_mysql5.7二进制部署
  10. vue项目使用大华摄像头怎样初始化_Vue接入监控视频技术总结
  11. this.scrollheight获取textarea的高度是0_【2019年14卷3期】UHF传感器固定角度和加装屏蔽罩对有效高度的影响丨电气工程学报文章推荐...
  12. 为什么有人说瑞士银行是全世界最安全的银行?
  13. 孙茂松教授——自然语言处理一瞥:知往鉴今瞻未来
  14. vue 数组遍历方法forEach和map的原理解析和实际应用
  15. c4d python技巧_还在Bug不断?不妨试试Python中的这2个装__技巧
  16. 2014年3月至2014年6月阅读记录(共64项)
  17. 微信小程序性能优化总结
  18. 【南航计算机网络实验】Ping 命令的实现
  19. 为什么onenote一直在加载_【完美解决】11.OneNote中英文字体不统一,微软10多年未解决的Bug!...
  20. 逆向学习之Hook技术

热门文章

  1. [PhoneGap]Mac下搭建PhoneGap开发环境
  2. Ext.example.msg()应用
  3. 关联Left Outer Join的第一条记录
  4. 解决布线困难的小方法-----无线路由器变身交换机
  5. SecureCRT 连接oracle数据库xServer图形界面服务
  6. ubuntu linux 启用root用户登录
  7. matlab图像水印技术研究,动态图像数字水印matlab的实现开题报告.doc
  8. mysql select大全_Mysql select 大全
  9. android关闭人脸检测功能,【Android知识】录像预览模式下打开人脸检测
  10. C++结构体传参问题