任务调度

在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发、线程池维护、运行时间规则解析、运行现场的保护以恢复等方面 Quartz框架是一个开源的企业级任务调度服务,已经被作为任务调度的良好解决方案.

Quartz框架核心

Quartz对任务调度进行了高度抽象,提出了3个核心概念,并在org.quartz包中通过接口和类进行了描述 任务:就是执行的工作内容。Quartz提供Job接口来支持任务定义 触发器:定义触发Job执行的时间触发规则。Quartz提供Trigger类及其子类支持触发器功能, 调度器:Quartz提供了Scheduler接口,将工作任务和触发器绑定,保证任务可以在正确的时间执行

运行环境

任务调度

任务执行

任务持久化

事务

集群

监听器和插进

下面我们直接来看例子

我们创建一个计划类 Plan

开始创建entity实体层定义任务的模板

public class Plan {
    private String date;//时间
    private String task;//任务

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Plan [date=" + date + ", task=" + task + "]";
    }
    public Plan() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Plan(String date, String task) {
        super();
        this.date = date;
        this.task = task;
    }

我们创建一个提醒服务类RemindService

定制一个泛型集合用户存储多个Plan对象,提供一个方法读取该泛型集合中的data

 */
public class RemindService {
public void printPlan(String userName){
    List<Plan> plansFormToday=getPlansFormToday(userName);
    System.out.println(userName+"//");
    for (Plan plan : plansFormToday) {
        System.out.println(plan+"\\\\");
    }

 }

private List<Plan> getPlansFormToday(String userName) {
    //模拟数据库查询,仅说明问题
    List<Plan> list=new ArrayList<Plan>();
    list.add(new Plan("2016-11-3 14:31:11","陶研会|地点:会议室C01"));
    list.add(new Plan("2016-11-3 14:31:20","总裁办公室|地点:总裁办公室"));
    return list;
}

我们创建一个任务调度类RemindJob

/**
 * 提醒业务类
 * @author Admin
 *
 */
public class RemindJob implements Job {
private RemindService service=new RemindService();
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        service.printPlan("你好!");
    }

    /**
     * @return the service
     */
    public RemindService getService() {
        return service;
    }
    /**
     * @param service the service to set
     */
    public void setService(RemindService service) {
        this.service = service;
    }

核心代码解析:

Job接口中只有一个 execute()方法,在实现类中 实现该方法以执行具体任务。

通过参数 JobExecutionContext 可以获取调度上下文的各 种信息,如:任务名称等

在原RemindJob的execute()方法中添加以下代码,可以获取该任务的名称、 绑定的触发器的名称和每次任务触发时间

      //获取用户信息
       JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        String value = (String)dataMap.get("happykey");
        System.out.println(value);
        System.out.println("TriggerName\t"+context.getTrigger().getKey().getName());
        System.out.println("JobName\t"+context.getJobDetail().getKey().getName());

真正的任务对象和触发器对象 Test

public class Test {
    public static void main(String[] args) throws SchedulerException {
        doRemind();
    }
public static void doRemind() throws SchedulerException{

    JobDetail job = JobBuilder.newJob(RemindJob.class)
            .withIdentity("job1", "group1").build();//创建一个任务

     /**
      * 创建触发器
      * 第一种方式  不太好
      */
    /*SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "myTriggerGroup").
    withSchedule(SimpleScheduleBuilder.simpleSchedule().
            withIntervalInSeconds(3).
            repeatForever()).
            startAt(new Date(System.currentTimeMillis()+1000)).build();*/    

    /**
     * 创建触发器
     * 第二种 方式  非常好
     * 可以 好用  2013年每月的第三个星期五上午10:30触发  0 30 10 ? * 6#3 2013
     * 2016年每月的第一个星期四下午16:17触发   0 17 16 ? * 5#1 2016
     * 每天15点到16点每5分钟运行一次,此外,每天17点到18点每5分钟运行一次  

     */
    CronTrigger trigger=TriggerBuilder.newTrigger()
            .withIdentity("myTrigger", "myTriggerGroup")
            .withSchedule(CronScheduleBuilder.cronSchedule("0 18 16 ? * 5#1 2016")).build();

    SchedulerFactory sf=new StdSchedulerFactory();//创建调度者工厂
    Scheduler scheduler = sf.getScheduler();//创建一个调度者
    scheduler.scheduleJob(job,trigger);//注册并进行调度
    scheduler.start();//启动调度

    //Thread.sleep(millis)

    //scheduler.shutdown();//关闭调度

}

核心代码解析:

这是通过JobDetail创建一个任务实例。

还可以通过JobDetail的JobDataMap对象来进行初始数据的设置,如传入需要提醒的用户姓名

public class TestJob {
    public void doRemind() throws SchedulerException, InterruptedException {
        JobDetail job = new JobDetail("remindJob", "group1", RemindJob.class);
        // 获取和任务关联的JobDataMap对象
        JobDataMap dataMap = job.getJobDataMap();
        dataMap.put("user", "张三"); // 在JobDataMap对象中设置用户数据
        // 省略原有程序代码
    }
}

JobBuilder类

使用SimpleTrigger创建一个触发器

    SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "myTriggerGroup").
    withSchedule(SimpleScheduleBuilder.simpleSchedule().
            withIntervalInSeconds().
            repeatForever()).
            startAt()).build();

创建一个调度器

SchedulerFactory sf=new StdSchedulerFactory();//创建调度者工厂
    Scheduler scheduler = sf.getScheduler();//创建一个调度者

注册任务和触发器

scheduler.scheduleJob(job,trigger);//注册并进行调度
    scheduler.start();//启动调度

启动和关闭调度

sched.start();
sched.shutdown(); 

上面的例子,基本算是完成了任务调度。

期待               第二版

Quartz框架(第一版)的更多相关文章

  1. Quartz框架

    Quartz框架 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz 允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多 ...

  2. 【淘淘】Spring整合Quartz框架

    我在外面工作实习的时候,我们做的项目是一个日报子系统,也就是定时定点为公司生成一些报表数据还有一些数据反馈.这时候我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.当时,我做 ...

  3. java任务调度quartz框架的小例子

    quartz是一个开源的作业调度框架,当然,java可以使用Timer来实现简单任务调度的功能,但Timer是单线程的设计方案,使得一个任务延迟会影响到其他的任务.java也可以使用Scheduled ...

  4. Quartz框架简介

    一.Quartz概述: Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间.其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高 ...

  5. [译]Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架

    第一课:开始使用Quartz框架 在你使用调度器之前,需要借助一些具体的例子去理解(谁愿意只是猜啊?).你可以使用SchedulerFactory类来达到程序调度的目的.有一些Quartz框架的用户可 ...

  6. Spring框架下的定时任务quartz框架的使用

    手头的这个项目需要用到定时任务,但之前没接触过这东西,所以不太会用,从网上找资料,大致了解了一下,其实也不难.Java的定时任务实现有三种,一种是使用JDK自带的Timer那个类来实现,另一种是使用q ...

  7. Quartz框架学习(1)—核心层次结构

    Quartz框架学习 Quartz(任务调度)框架的核心组件: job:任务.即任务调度行为中所要调度的对象. trigger:触发器.是什么促使了一个任务的调度?当然是时间.这也算事件驱动类型程序. ...

  8. 使用Quartz框架定时发送预警邮件

    1.  Quartz定时发送预警邮件 1.1.   需求及实现思路 定时查询库存预警信息,一旦存在库存预警的商品,则发邮件通知相关人员 1.2.   Quartz框架 Quartz是OpenSymph ...

  9. Quartz框架多个trigger任务执行出现漏执行的问题分析--转

    原文地址:http://blog.csdn.net/dailywater/article/details/51470779 一.问题描述 使用Quartz配置定时任务,配置了超过10个定时任务,这些定 ...

随机推荐

  1. H3 BPM让天下没有难用的流程之技术特性

    一.集成性  H3 BPM可以与其它系统进行多个层面的集成,满足企业的针对不同系统的集成需求. 图:多种集成维度 Ø  用户集成 可与企业现有系统进行组织架构同步或调用,也可以直接与AD 进行集成. ...

  2. Linux下用netstat查看网络状态、端口状态(转)

    转:http://blog.csdn.net/guodongdongnumber1/article/details/11383019 在linux一般使用netstat 来查看系统端口使用情况步.  ...

  3. css样式让input垂直居中

    css样式让input垂直居中 css代码: .div1{ border: 1px solid #CCC; width:1120px; height:40px; margin:auto; displa ...

  4. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  5. 一步步学习javascript基础篇(8):细说事件

    终于学到事件了,不知道为何听到“事件”就有一种莫名的兴奋.可能是之前的那些知识点过于枯燥无味吧,说起事件感觉顿时高大上了.今天我们就来好好分析下这个高大上的东西. 可以说,如果没有事件我们的页面就只能 ...

  6. 冗余代码都走开——前端模块打包利器 Rollup.js 入门

    之前翻译过一篇文章,介绍了通过 ES2015 的解构赋值语法引入模块,可以让打包工具(browserify)最终编译出来的代码量最小化. 殊不知在 webpack 1.X 版本是无法利用该特性来避免引 ...

  7. [Solr] (源) Solr与MongoDB集成,实时增量索引

    一. 概述 大量的数据存储在MongoDB上,需要快速搜索出目标内容,于是搭建Solr服务. 另外一点,用Solr索引数据后,可以把数据用在不同的项目当中,直接向Solr服务发送请求,返回xml.js ...

  8. TODO:数据库优化之分页

    TODO:数据库优化之分页 本文的例子是以MongoDB数据库为准,其它数据库各位也可以举一反三进行优化. 在MongoDB中分页使用 a.skip(n)跳过前n个匹配的文档: b.limit(m)返 ...

  9. Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉

    Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉 1.1. 按照当前流行的分类方法,可以分为以下三部分:三部分 图像处理 图像分析 计算机视觉1 1.2. 图像处理需要 ...

  10. angular view之间的数据传递

    之前写过一篇backbone view之间的传递,由于现在在用angular搞开发,现在也来总结一下.在angular 传递数据通俗的讲叫做 广播 ,在一些文章中,也叫做事件的发布与订阅,在angul ...