Quartz运务调度,看完这篇就够了

Quartz简介

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:

持久性作业 - 就是保持调度定时的状态;

作业管理 - 对调度作业进行有效的管理;

Quartz运行环境。

  1. Quartz 可以运行嵌入在另一个独立运行的程序中。
  2. Quartz可以在应用程序服务器(或servlet容器中)被实例化,并且参与事务。
  3. Quartz 可以作为一个独立的应用程序运行。可以通过RMI使用。
  4. Quartz 可以被实例化,作为独立的项目集群,用于任务执行。

Quartz的设计模式。

  1. Builder模式
  2. Factory模式,工厂模式
  3. 组件模式
  4. 链式模式

Quartz的核心概念

1.任务job

Job就是你想要实现的任务类。每一个Job必须实现的org.quartz.job接口。且需实现接口的Execute()方法。

2.触发器Trigger

Trigger为你执行任务的触发器,比如你想每天定时8点钟去打卡,Trigger就会设置在8点钟去执行该任务。

Trigger主要有2种触发器器,分别为SimpleTrigger ,CornTrigger两种。

3.调度器Scheduler

Scheduler为任务调度器,它将任务Job和触发器Trigger整合起来。负责基于Trigger设定的时间来执行job。

Quartz的体系结构

Quartz运务调度,看完这篇就够了

开启一个Quartz项目

1.依赖


    org.quartz-scheduler
    quartz

2.编写job

package com.keelon.quz.demo.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //输出当前的时间的任务
        Date date = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd HH:MM:SS");
        String dateStr = formatter.format(date);
        System.out.println("正在进行数据库备份"+"时间是:"+dateStr);

    }
}

3.调用。

package com.keelon.quz.demo.job;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TestJob {

    public static void main(String[] args) throws SchedulerException {
        Scheduler scheduled = StdSchedulerFactory.getDefaultScheduler();
        JobDetail jobDetailb = JobBuilder.newJob(MyJob.class).withIdentity("job1","group1").build();
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
        scheduled.scheduleJob(jobDetailb,trigger);
        scheduled.start();
    }
}

JobExecutionContext

JobExecutionContext 是一个包含了各种上下文信息的句柄,指向执行中的JobDetail 实例 和 执行完成的Trigger实例

当Schedule调用一个Job时,就会将JobExecutionContext传递给Job的exceute()方法。
Job能够通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的数据明细。我可以通过这个context来访问Trigger,Jobs相关的信息。

 JobKey jobKey = jobExecutionContext.getJobDetail().getKey();
 log.info("工作任务的名称",jobKey.getName());
  TriggerKey triggerKey =jobExecutionContext.getRecoveringTriggerKey();
  log.info("工作任务的工作组的名称",jobKey.getName());

JobDataMap介绍

1.使用Map获取

在进行任务调度时,JobDataMap存储在JobExecutionContext中非常方便的进行获取。

jobDataMap可以装载任何可序列化的对象。当job实例对象被执行的时候,这些参数会传递给Job

放入参数

Scheduler scheduled = StdSchedulerFactory.getDefaultScheduler();
JobDetail jobDetailb = JobBuilder.newJob(MyJob.class).withIdentity("job1","group1").usingJobData("message","jobs").build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").startNow()
        .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5)).usingJobData("message","这是trigger").build();
scheduled.scheduleJob(jobDetailb,trigger);
scheduled.start();

取出参数

String msg = jobExecutionContext.getJobDetail().
getJobDataMap().getString("message");

Job有状态和无状态

Job中有一个StatefulJob子接口,代表着有状态的任务,该接口是一个没有方法的标签接口,其目的就是让Quartz知道任务的类型,以便采用不同的执行方案。

无状态任务在执行时,拥有自己的JobDataMap拷贝,每次执行时,都会创建一个新的实例,对JobData的更改不会影响下次的执行。而有状态任务共享同一个JobDataMap实例,每次任务执行对JobDataMap所做的更改都会保存下来,后面的执行可以看到这个更改。也就是每次执行任务后都会对后面的执行发生影响。

正因为这个原因,无状态的Job可以并发执行,而有状态的StatefulJob不能并发执行。

CronTrigger触发器

如果你需要像日历一样,按照日程来触发任务,而不是像SimpleTrigger那样每隔定时间来触发,CornTrigger更加的实用。因为他是基于日历的作业调度器。

使用CronTrigger,你可以指定“每个周五中午”,或者每个工作日的十点钟。或者每周一,像这样的日程安排触发。

1.Cron Expression -Cron表达式

Cron表达式是来配置,CronTrigger实例。Cron表达式是有7个子表达式组成的字符串,每个表达式都描述了一个单独的日程细节。这些表达式用空格来分割。分别表示如下

1.Second 秒

2.Minutes 分钟

3.Hours小时

4 Day of Month 月中的每天

5 Month 月

6 Day of Week 周中某天

7 Year 年

例如下面写一个每个9月19号,每5秒执行一次。

Date startDate = new Date();
startDate.setTime(startDate.getTime()+5000);

Date endDate = new Date();
endDate.setTime(endDate.getTime()+10000);

Scheduler scheduled = StdSchedulerFactory.getDefaultScheduler();
JobDetail jobDetailb = JobBuilder.newJob(JobTrigger.class).withIdentity("job1","group1").build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").startAt(startDate).endAt(endDate)
        .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * 19 9 ?")).build();
scheduled.scheduleJob(jobDetailb,trigger);
scheduled.start();
展开阅读全文

页面更新:2024-05-14

标签:链式   都会   触发器   作业   工作任务   表达式   实例   接口   对象   独立   状态   参数   模式   时间   方法   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top