设为首页    加入收藏
                 
徐州北大青鸟高中、中专、职高生就业解决方案 在职、转行、待业人员就业方案 北大青鸟中博校区环境 徐州中博大学生就业方案 校区周边环境
您的位置:首页 - 编程技巧   

quartz官方文档汉化教程_014
作者:中博IT教育 出处:中博IT教育 时间:2011-03-21


北大青鸟中博教师—常磊

懒人兄弟们,今天是大结局。可以直接下源码,相关补充,请看帖子最后的总结。

 

本范例演示,Trigger同时触发的时候,如何使用Trigger优先级来管理触发顺序。3个触发器的优先级分别是-5,5,10。很显然争用线程资源的时候,优先级为10的触发器优先触发。

 

1.         log4j.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

  <appender name="default" class="org.apache.log4j.ConsoleAppender">

    <param name="target" value="System.out"/>

    <layout class="org.apache.log4j.PatternLayout">

      <param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/>

    </layout>

  </appender>

 

 <logger name="org.quartz">

   <level value="debug" />

 </logger>

 

  <root>

    <level value="debug" />

    <appender-ref ref="default" />

  </root>

</log4j:configuration>

 

2.         quartz_priority.properties

org.quartz.scheduler.instanceName=PriorityExampleScheduler

 

#设置线程池的大小为1,来强迫排程同一时间只能运行一个任务。

#运行时按照优先级排序。

org.quartz.threadPool.threadCount=1

org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool

 

org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore

 

3.         TriggerEchoJob.java

package com.zbaccp.quartz.cl.example14;

 

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

 

/**

 * 一个简单的job,打印触发job的触发器名称

 *

 * @author 林艺

 */

public class TriggerEchoJob implements Job {

 

    private static final Log LOG = LogFactory.getLog(TriggerEchoJob.class);

 

       /**

        * 默认构造函数

        */

    public TriggerEchoJob() {

    }

 

    /**

     * 打印触发job的触发器名称

     */

    public void execute(JobExecutionContext context)

        throws JobExecutionException {

        LOG.info("=========TRIGGER名称: " + context.getTrigger().getName());

    }

 

}

 

4.         PriorityExample.java

package com.zbaccp.quartz.cl.example14;

 

import java.util.Calendar;

 

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.quartz.JobDetail;

import org.quartz.Scheduler;

import org.quartz.SchedulerFactory;

import org.quartz.SimpleTrigger;

import org.quartz.impl.StdSchedulerFactory;

 

/**

 * 本范例演示,Trigger同时触发的时候,如何使用Trigger优先级来管理触发顺序。

 * 3个触发器的优先级分别是-5,5,10。很显然争用线程资源的时候,优先级为10的触发器优先触发。

 */

 

public class PriorityExample {

   

    public void run() throws Exception {

        Log log = LogFactory.getLog(PriorityExample.class);

 

        log.info("------- Initializing ----------------------");

 

        //1 创建排程工厂,并且使用properties初始化

        SchedulerFactory sf = new StdSchedulerFactory("quartz_priority.properties");

        Scheduler sched = sf.getScheduler();

 

        log.info("------- Initialization Complete -----------");

 

        log.info("------- Scheduling Jobs -------------------");

 

        JobDetail job = new JobDetail("TriggerEchoJob", null, TriggerEchoJob.class);

 

        //1次的时候,3个触发器将同时触发,根据优先级运行。第2次的时候,执行顺序已经叉开,因此与优先级无关。

        // 我们将看到如下的触发顺序:

        // 1. Priority10Trigger15SecondRepeat

        // 2. Priority5Trigger10SecondRepeat

        // 3. PriorityNeg5Trigger5SecondRepeat

        // 4. PriorityNeg5Trigger5SecondRepeat

        // 5. Priority5Trigger10SecondRepeat

        // 6. Priority10Trigger15SecondRepeat

       

        //2 设定第1次触发的时间

        Calendar startTime = Calendar.getInstance();

        startTime.add(Calendar.SECOND, 5);

       

        //2.1 触发器1,优先级-5,触发间隔5

        SimpleTrigger trigger1 =

            new SimpleTrigger("PriorityNeg5      Trigger5SecondRepeat", null, startTime.getTime(), null, 1, 5L * 1000L);

        trigger1.setPriority(-5);

        trigger1.setJobName("TriggerEchoJob");

 

        //2.2触发器2,优先级5,触发间隔10

        SimpleTrigger trigger2 =

            new SimpleTrigger("Priority5      Trigger10SecondRepeat", null, startTime.getTime(), null, 1, 10L * 1000L);

        trigger1.setPriority(5);

        trigger2.setJobName("TriggerEchoJob");

       

        //2.3 触发器3,优先级10,触发间隔15

        SimpleTrigger trigger3 =

            new SimpleTrigger("Priority10    Trigger15SecondRepeat", null, startTime.getTime(), null, 1, 15L * 1000L);

        trigger3.setPriority(10);

        trigger3.setJobName("TriggerEchoJob");

       

        //3 预安排job

        sched.scheduleJob(job, trigger1);

        sched.scheduleJob(trigger2);

        sched.scheduleJob(trigger3);

 

 

        sched.start();

        log.info("------- Started Scheduler -----------------");

 

        //4 等待30秒钟,等待所有的job运行结束

        log.info("------- Waiting 30 seconds... -------------");

        try {

            Thread.sleep(30L * 1000L);

            // executing...

        } catch (Exception e) {

        }

 

        //5 关闭scheduler

        log.info("------- Shutting Down ---------------------");

        sched.shutdown(true);

        log.info("------- Shutdown Complete -----------------");

    }

 

    public static void main(String[] args) throws Exception {

        PriorityExample example = new PriorityExample();

        example.run();

    }

}

 

5.         我们的结论

1)        有些时候,当有太多的触发器或者池里的工作线程太少。本来应当同时触发的触发器,但是Quartz没有足够的的资源立即触发这些Triggers。这种情况下,你也许希望某个触发器占用线程先开始,那么你必须设置触发器的优先级。

2)        触发器默认的优先级是5

3)        任何整数,不管是正的还是负的,都是可用的优先级。

 

结束语

文件下载:quartzOfficial14.rar

>>更多新闻
相关新闻
quartz官方文档汉化教程_013 quartz官方文档汉化教程_013
quartz官方文档汉化教程_012 quartz官方文档汉化教程_012
quartz官方文档汉化教程_011 quartz官方文档汉化教程_011
quartz官方文档汉化教程_010 quartz官方文档汉化教程_010
 
在线报名
  • 姓     名:*
  • Q       Q:*
  • 电     话:*
  • 地     址:*
在线咨询  
中心简介
校区简介
校区环境
关于北大青鸟
特色优势
常见问题解答
网站地图
 
ACCP5.0 课程咨询
ACCP软件工程师课程
什么是ACCP
ACCP5.0课程介绍
各课程定位与特色
各阶段课程
教学模式
ACCP5.0课程体系
ACCP认证证书
 
中博教育客服在线
©徐州北大青鸟 隐私政策
学费咨询
学历咨询
专业咨询
订座试听
就业咨询
课程咨询
测试认证
软件认证