quartz介绍

Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。本系统结合通过 Spring 来集成 Quartz 。

Quartz  下载地址 :http://grepcode.com/snapshot/repo1.maven.org/maven2/org.quartz-scheduler/quartz/1.7.3

 

 

 

 

quartz需要明确几个概念: 

1. scheduler:任务(job)调度器 
2. trigger:任务(job)调度器 
3. job:任务 

 


比较重要的几个关系: 

1. scheduler和trigger都是为job服务的,scheduler更像一个容器,存储job及其相关的信息的; 
2. trigger,顾名思义就是来告诉scheduler,什么时候调度已经在容器(scheduler)中的job; 

 

 1 、JobDetail : JobDetail 是一个具体的类。
 2、Trigger :触发器,它用于定义 Job 何时执行。最常用的是 SimpleTrigger 和 CronTrigger 。一般来说,如果你需要在一个固定的时间和重复次数或者一个固定的间隔时间,那么 SimpleTrigger 比较合适;如果你有许多复杂的作业调度,那么 CronTrigger 比较合适。CronTrigger 和 Unix 的 cron 机制基本一样,我们需要的只是一个 cron 表达式。比如“ 0 0 12 * * ? ”会在每天中午 12 点触发 执行;“ 0 15 10 ? * 6L ”会在每个月的最后一个星期五的早上 10:15 触发 Job 执行。
 3、 Scheduler 和 SchedulerFactory : Scheduler 负责管理 Trigger 、调度 Job , SchedulerFactory 则是 Scheduler 工厂,负责生成Scheduler 。

 



剩下的基本上就清楚了 

1. 创建一个scheduler 
2. 创建job,绑定trigger --- > 这个有个综合的概念jobdetail 
3. 添加、移除jobDetail

 

 

 

 

 

 

 

 

 

 

 

 以下两种方式注册和使用

1.自己管理job 

/**
 * 注册job
 *
 */
public class JobSchedule {
    private static final Logger log = LoggerFactory.getLogger(JobSchedule.class);
    
    private static final SchedulerFactory sf = new StdSchedulerFactory();
    private static final String JOB_GROUP_NAME = "job_nsanban";
    private static final String TRIGGER_GROUP_NAME = "trigger_nsanBan";
    
    
    public static void addJob(String jobName, Job job, String time) throws SchedulerException, ParseException {
        log.info("注册定时任务.任务名称:"+jobName+";任务执行类:"+job.getClass()+";执行时间:"+time);
        
        Scheduler sched = sf.getScheduler();
        JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, job.getClass());// 任务名,任务组,任务执行类
        // 触发器
        CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组
        trigger.setCronExpression(time);// 触发器时间设定
        sched.scheduleJob(jobDetail, trigger);
        // 启动
        if (!sched.isShutdown())sched.start();
        
    }
}

 

 

 2.spring管理job

    <!-- Timer schedule -->

    <!--要调度的对象-->
    <bean id="jobBean" class="net.xsbiz.common.MakeHtml" />
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="jobBean" />
        <property name="targetMethod" value="execute" />
        <!--将并发设置为false-->
        <property name="concurrent" value="false" />
    </bean>

    <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
         <property name="jobDetail" ref="jobDetail" />
                 <!--表达式,我的是每 30 执行一次-->
               &nbsp;<property name="cronExpression" value="0/30 * * * * ?" />
    </bean>

    <!--  总管理类如果将lazy-init='false'那么容器启动就会执行调度程序   -->
    <bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" >
         <property name="triggers">
             <list>
                 <!--作业调度器,list下可加入其他的调度器-->
                <ref bean="trigger" />
             </list>
        </property>
    </bean>

 

//调用的类
public class MakeHtml {
    //调用的方法
    public void execute(){
        //需要做的事情
    }


         public static void main(String[] args) {
        
         
            System.out.println("----begin---"); 

            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 

            // 如果配置文件中将startQuertz bean的lazy-init设置为false 则不用实例化 

            context.getBean("startQuertz"); 

            System.out.print("----end---");
          

    }

}

 

posted @ 2015-09-22 09:07  243573295  阅读(497)  评论(0编辑  收藏  举报