`

quartz作业调度浅析

 
阅读更多

我知道quartz作业调度花了5天时间实在说明我有点笨,不过没关系,我已经会了,原理都清楚了,简单的应用都可以轻松搞定。哈哈,等以后要用到Spring框架的时候再回过头来看怎么再配置文件中设置quartz调度,不管在哪里,调度的原理都是一样的,只是展现的形式不同罢了。

 

动态的配置quartz作业调度:

需要三个类:QuartzTest.java,MySchedulerManage.java,MyJob.java

在一个工程中(不管是web项目还是java Project项目)都需要导入三个包

分别为:quartz-all-1.6.6.jar,commons-collections-3.2.jar,commons-logging-1.1.jar。

 

创建:

 

一个job可以绑定一个或者多个trigger,但是一个trigger只能有一个job相对应

1.首先创建一个调度器工厂StdScheduleFactory来获取一个Schedule实例

2.创建一个JobDetail实例,参数为job的name,group以及实现job的类(在下面的例子中这个类就是Myjob)

3.创建一个SimpleTrigger或者CronTrigger,可以不设置参数,因为这两个类的实现了很多getXXX()和setXXX()方法来设置各个属性

4.用调度器实例将job和trigger绑定并注册到Schedule中

5.启动调度器

 

修改:

 

方法一:

1.通过trigger的name和group取得在job中已经存在的trigger

2.给这个得到的trigger重新定义触发的表达式

3.调度器重新载入trigger

Sch.reScheduleJob(triggerName,triggerGroup,trigger)

其中Sch为调度器实例

方法二:

1.通过trigger的name和group取得在job中已经存在的trigger

2.通过jobDetail实例的jobName和jobGroup从调度器中删除这个job

3.重新定义trigger触发事件的表达式

4.再把这个trigger和job绑定并且注册到调度器中

Sch.scheduleJob(jobDetail,trigger)

其中Sch为调度器实例

 

一个job绑定多个trigger:

当一个job已经存在trigger的时候,可以重新创建一个trigger,但是与原先的trigger必需不一样,trigger的name和group其中有一样不同即可。

1.创建一个trigger,在创建的时候指定trigger的name和group以及他所属的job(通过指定job的name和group来唯一指定job)

CronTrigger trigger2 = new CronTrigger("trigger2", "group2", 

jobdetail.getName(), jobdetail.getGroup());

2.给trigger设置触发表达式

3.将trigger绑定到相应的job里面

sch.scheduleJob(trigger2);

在这里并不需要指定job,因为trigger在新建的时候已经已经指定了

(注意:并不是sch.scheduleJob(jobdetail, trigger))

 

 

下面是我测试的例子

 

入口类(启动quartz作业调度):QuartzTest

 

import java.text.ParseException;
import org.quartz.SchedulerException;
 
public class QuartzTest {
 
        /**
         * @param args
         * @throws ParseException 
         * @throws SchedulerException 
         */
        public static void main(String[] args) throws SchedulerException, ParseException {
                MyJob job = new MyJob();
                MySchedulerManage.startUp("LH", job, "0/2 * * * * ?");
        }
 
}

 quartz作业调度处理类:MySchedulerManage

import java.text.ParseException;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
 
public class MySchedulerManage {
        private static SchedulerFactory sf = new StdSchedulerFactory();
        private static String GROUP_NAME = "group1"; 
        private static String TRIGGER_NAME = "trigger1"; 
         
        public static void startUp(String JobName,MyJob job,String time) throws SchedulerException, ParseException{
                Scheduler sch = sf.getScheduler();
                //创建一个JobDetail
                JobDetail jobdetail = new JobDetail(JobName,GROUP_NAME,job.getClass());
                //创建一个Trigger
                CronTrigger trigger = new CronTrigger(TRIGGER_NAME,"group2");
                //把JobDetail和Trigger放入Scheduler中,触发器和作业绑定
                trigger.setCronExpression(time);
                sch.scheduleJob(jobdetail, trigger);
                if(!sch.isShutdown()){
                        sch.start();
                }
        }
         
        public static void modifyJob(JobDetail jobdetail,String time,String time1) 
                throws SchedulerException, ParseException{
                Scheduler sch = sf.getScheduler();
                //必须以trigger的name以及group去获取这个trigger,否则获取不到trigger
                CronTrigger trigger = (CronTrigger)sch.getTrigger(TRIGGER_NAME, "group2");
                /*
                //修改一个job中的trigger以及向job中添加多个trigger的一种写法
                if(null!=trigger){
                        System.out.println("after delete method");
                        trigger.setCronExpression(time);
                        System.out.println("重新调度job");
                        sch.rescheduleJob(trigger.getName(), "group2", trigger);
                }
                CronTrigger trigger2 = new CronTrigger("trigger2", "group2", 
                                jobdetail.getName(), jobdetail.getGroup());
                trigger2.setCronExpression(time1);
                sch.scheduleJob(trigger2);
                */
                //修改一个job中的trigger以及向job中添加多个trigger的另一种写法
                if(null!=trigger){
                        //把job从这个schedule中移除
                        sch.deleteJob(jobdetail.getName(), "group1");
                        trigger.setCronExpression(time);
                        System.out.println("重新调度");
                }
                //把修改后的job重新设置到schedule中
                sch.scheduleJob(jobdetail, trigger);
                CronTrigger trigger2 = new CronTrigger("trigger2", "group2", 
                                jobdetail.getName(), jobdetail.getGroup());
                trigger2.setCronExpression(time1);
                //添加一个新的trigger到schedule中,现在只知道这种方法
                sch.scheduleJob(trigger2);
        }
}

 作业实现类:MyJob(实现job接口)

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.SchedulerException;

 

 

public class MyJob implements Job {

        private static int i = 0;

        public void execute(JobExecutionContext context) {

                // TODO Auto-generated method stub

                i++;

                SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

                System.out.println(f.format(new Date())+"正在执行第"+i+"个Job   executing...");

                //当时间到2011-09-14 15:52:00的时候对job中的trigger进行修改

                if(f.format(new Date()).equals("2011-09-14 15:52:00")){

                        System.out.println(f.format(new Date())+"正在执行另一个Job   executing...");

                        try {

                                MySchedulerManage.modifyJob(context.getJobDetail(),

                                            "0 53 15 * * ?","0 54 15 * * ?");

                        } catch (SchedulerException e) {

                                e.printStackTrace();

                        } catch (ParseException e) {

                                e.printStackTrace();

                        }

                }

        }

}

 

 

分享到:
评论

相关推荐

    Quartz(作业调度)

    Quartz是一款开源的作业调度框架,它为Java应用程序提供了强大的定时任务处理能力。在Spring框架中,Quartz可以被集成来实现复杂的定时任务调度。本文将深入探讨Quartz的使用,包括其基本概念、配置、API以及在Web...

    Quartz作业调度框架

    Quartz作业调度框架是Java领域中非常重要的一个开源作业调度库。作业调度是指在预定的时间安排特定的任务进行执行。在企业级应用中,作业调度扮演着核心的角色,它使得企业能够自动化地执行定时任务,比如数据备份、...

    学习笔记_Quartz作业调度框架,使用corn表达式

    Quartz作业调度框架是Java开发中的一个强大工具,用于实现定时任务和工作流管理。它以其灵活性、可扩展性和稳定性而被广泛应用。本学习笔记主要围绕Quartz的使用,特别是如何利用corn表达式来设置定时任务。 Quartz...

    quartz作业调度测试

    这个"quartz作业调度测试"项目可能是为了演示或测试Quartz如何在实际应用中配置和使用。 首先,Quartz的核心概念包括Job(作业)、Trigger(触发器)和Scheduler(调度器)。Job是需要执行的任务,Trigger定义了...

    quartz作业调度Demo

    Quartz作业调度是一个开源的Java作业调度框架,它允许开发者创建、调度和执行应用程序中的重复或定时任务。这个"quartz作业调度Demo"提供了一个简单的示例,帮助我们理解如何在实际项目中利用Quartz来管理任务。 1....

    Quartz作业调度器

    Quartz作业调度器是Java平台上的一个开源任务调度框架,广泛应用于企业级应用中,用于自动化执行周期性任务。Spring框架提供了对Quartz的集成,使得在Spring应用中使用Quartz变得更加便捷。这个压缩包文件可能包含了...

    作业调度Quartz.net源代码

    这个“作业调度Quartz.net源代码”文件很可能是包含了Quartz.NET的示例代码或者一个简单的项目,帮助用户理解和学习如何使用Quartz.NET进行作业调度。 Quartz.NET的核心概念包括作业(Job)、触发器(Trigger)和...

    quartz作业调度demo

    本示例"quartz作业调度demo"是针对初学者设计的,旨在帮助他们快速理解并上手Quartz的基本用法。 Quartz的核心概念包括Job(作业)、Trigger(触发器)和Scheduler(调度器)。以下是对这些关键概念的详细解释: 1...

    web环境下Quartz作业调度入门源代码(Jboss)

    本示例“web环境下Quartz作业调度入门源代码(Jboss)”提供了一个基础的Quartz在Web应用中的实现,下面我们将详细探讨相关的知识点。 1. **Quartz简介** - Quartz是一个轻量级的作业调度框架,支持Cron表达式和复杂...

    spring-Quartz(作业调度)

    Quartz 是个开放源码项目,提供了丰富的作业调度集。在这篇文章中,软件工程师 Michael Lipton 和IT 架构师 Soobaek Jang 对 Quartz API 进行了介绍,从对框架的一般概述开始,并以一系列展示 Quart 基本特性的代码...

    quartz开源作业调度框架

    ### quartz开源作业调度框架知识点详解 #### 一、Quartz框架简介 Quartz是一个功能强大的、开源的作业调度框架,完全由Java编写而成。它能够被应用在服务器端的Java应用程序中,帮助开发者轻松地创建并管理定时任务...

    Quartz.net作业调度自定义定时执行任务多任务执行c#

    Quartz.NET是一个强大的开源作业调度框架,用于在.NET环境中创建和执行定时任务。它提供了高度灵活的调度功能,使得开发者可以轻松地定义和控制任务的执行时间。在"Quartz.net作业调度自定义定时执行任务多任务执行...

    quartz作业调度

    quartz作业调度,quartz结构,quartz表达式,quartz配置

    Quartz - 作业调度框架

    Quartz是一款广泛应用于Java环境中的开源作业调度框架,它的核心功能是实现任务的自动化执行,如定时触发、周期性执行等。Quartz以其强大的灵活性和稳定性,在企业级应用中占据了重要地位,尤其对于需要定时执行任务...

    Quartz.NET 调度系统 demo

    前言:8月份翻译了Quartz.NET的官方课程:开源的作业调度框架 - Quartz.NET, 有的朋友抱怨难用,确实,目前Qiartz.NET的最新版本还是0.6,还存在很多bug和不完善的地方。本文使用一系列代码示例介绍 Quartz.NET API...

    Quartz一个开源的作业调度框架

    Quartz是一个广泛应用于企业级应用中的开源作业调度框架,它为开发者提供了强大的任务调度功能,使得应用程序能够在预定的时间执行特定的任务。Quartz的核心设计目标是简单易用且可高度扩展,能够满足从小型项目到...

Global site tag (gtag.js) - Google Analytics