<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 2,comments - 8,trackbacks - 0
    參考《Prentice.Hall.PTR.Quartz.Job.Scheduling.Framework.Building.Open.Source.Enterprise.Applications.Jun.2006》以及quartz發(fā)行包帶的例子寫的一篇關(guān)于quartz的使用小文。

    ?

    Quartz是一個(gè)開源的作業(yè)調(diào)度框架,它完全由java寫成,并設(shè)計(jì)用于J2SEJ2EE應(yīng)用中。你能夠用它來為執(zhí)行一個(gè)作業(yè)而創(chuàng)建簡單的或復(fù)雜的調(diào)度。比如:每天或每周星期二晚上1130,或許僅僅每個(gè)月的最后一天執(zhí)行,或者在某人離開本站后給他發(fā)Email等等。

    ?

    Quartz項(xiàng)目的官方網(wǎng)站:http://www.opensymphony.com/quartz/

    目前發(fā)布的版本為1.6.0

    其運(yùn)行要求JDK版本1.4.0以上,以及第三方庫的支持:

    J2EE.jar

    Commons-beanutils.jar

    Commons-collections-3.1.jar

    Commons-dbcp-1.2.1.jar

    Commons-digester-1.7.jar

    Commons-logging.jar

    Commons-logging-api.jar

    Commons-modeler-1.1.jar

    Commons-pool-1.2.jar

    Commons-validator-1.1.4.jar

    一.Quartz的基本介紹

    Quartz定義了很多包很多類其規(guī)模不小。Quartz任務(wù)調(diào)度主要由三個(gè)部件組成:schedulerTriggerJobDetail

    Quartz的接口類圖如下:

    ?

    ?

    1.1 schedulerTriggerJobDetail

    Schedulerquartz的核心,管理所有任務(wù)。它通過SchedulerFactory單態(tài)實(shí)例工廠產(chǎn)生。SchedulerStart之后做下列任務(wù):保存Job,保存Trigger,觸發(fā)任務(wù),查看未點(diǎn)火的任務(wù)(Misfire Trigger),刪除不可能觸發(fā)的任務(wù)等。

    Trigger顧名思義為觸發(fā)器 scheduler就是通過它來觸發(fā)任務(wù)。它有幾個(gè)分類常用的有SimpleTrigger CronTriggerSimpleTrigger也就是簡單觸發(fā)器,用來觸發(fā)周期性任務(wù)比如每多少多少時(shí)間觸發(fā)一次。它可以指定StartTime 也就是設(shè)置從什么時(shí)候開始觸發(fā)。

    CronTrigger就是用Cron表達(dá)式來定義觸發(fā)時(shí)間的觸發(fā)器。Cron表達(dá)式從Unix克隆表達(dá)式的進(jìn)化過來的。其形式相對其表達(dá)的意思來說很簡單。

    比如 0 0 0/2 * 3 6L * 的意思是 3月份的最后一個(gè)星期的星期五每兩小時(shí)觸發(fā)一次

    就這樣你可以設(shè)定論何時(shí)間。

    ?

    JobDetail包含了任務(wù)的具體信息包括任務(wù)名稱,任務(wù)所在的組,任務(wù)執(zhí)行的類,還可以設(shè)置任務(wù)的一些參數(shù)。任務(wù)執(zhí)行的類就是你想讓任務(wù)要作的事情可以是論何事情打印一行HelloWorld,計(jì)算一下執(zhí)行時(shí)間,統(tǒng)計(jì)一下訪問人數(shù),數(shù)據(jù)庫操作等等,但是必須要實(shí)現(xiàn)QuartzJob接口。Job接口很簡單就一個(gè)方法public void execute(JobExecutionContext context)在這個(gè)方法里面寫入你要做的事。JobExecutionContext包含了任務(wù)執(zhí)行的一些環(huán)境你可以通過它得到很多東西JobDetai Trigger Schedule等等。

    1.2 HelloWorld

    下面就用一個(gè)簡單的例子來說明Quartz是怎么用的:

    首先要有一個(gè)實(shí)現(xiàn)了Job接口的類 我們讓它輸出HelloWorld

    ?

    import?java.util.Date;

    ?

    import?org.apache.commons.logging.Log;

    import?org.apache.commons.logging.LogFactory;

    import?org.quartz.Job;

    import?org.quartz.JobExecutionContext;

    import?org.quartz.JobExecutionException;

    ?

    public?class?HelloJob?implements?Job?{

    ?

    ????
    private?static?Log?_log=LogFactory.getLog(HelloJob.class);?

    ????
    public?void?execute(JobExecutionContext?context)?throws?JobExecutionException?{

    ???????
    //?TODO?Auto-generated?method?stub

    ???????_log.debug(
    "Hello?world!-"+new?Date());

    ????}


    }


    然后生成Scheduler實(shí)例定義JobDetail?Trigger來調(diào)度它

    import?java.util.Date;

    import?org.apache.commons.logging.Log;

    import?org.apache.commons.logging.LogFactory;

    import?org.quartz.CronTrigger;

    import?org.quartz.JobDetail;

    import?org.quartz.JobListener;

    import?org.quartz.Scheduler;

    import?org.quartz.SchedulerFactory;

    import?org.quartz.TriggerUtils;

    import?org.quartz.impl.StdSchedulerFactory;

    ?

    public?class?SimpleExample?{

    ????
    public?void?run()throws?Exception{

    ???????Log?log
    =LogFactory.getLog(SimpleExample.class);

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

    ???????SchedulerFactory?sf?
    =?new?StdSchedulerFactory();

    ????????Scheduler?sched?
    =?sf.getScheduler();

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

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

    ????????JobDetail?job?
    =?new?JobDetail("myJob2",?"group1",?HelloJob.class);????????

    ????????CronTrigger?trigger
    =new?CronTrigger("MyTrigger2","group1","myJob2","group1");

    ????????trigger.setCronExpression(
    "0/20?*?*?*?*??");

    ????????sched.scheduleJob(job,?trigger);

    ????????sched.start();

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

    ????????log.info(
    "-------?Waiting?90?seconds?-------------");

    ????????
    try?{

    ????????????
    //?wait?90?seconds?to?show?jobs

    ????????????Thread.sleep(
    90L?*?1000L);?

    ????????????
    //?executing

    ????????}
    ?catch?(Exception?e)?{

    ????????}


    //?shut?down?the?scheduler

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

    ????????sched.shutdown(
    true);

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

    ????}


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

    ????????SimpleExample?example?
    =?new?SimpleExample();

    ????????example.run();

    ????}


    }


    就這樣運(yùn)行一下quartz就能調(diào)度我們定義的HelloJob的任務(wù)了。可以看到我們先獲得一個(gè)SchedulerFactory實(shí)例產(chǎn)生一個(gè)Scheduler實(shí)例,然后定義了一個(gè)JobDetail JobDetail job = new JobDetail("myJob2", "group1", HelloJob.class);

    將他與HelloJob綁定。定義了一個(gè)Trigger

    CronTrigger trigger=new
    ?CronTrigger("MyTrigger2","group1","myJob2","group1");

    然后設(shè)置其Cron表達(dá)式:

    trigger.setCronExpression("0/20 * * * * ?");

    意思是每20秒執(zhí)行一次

    最后將他們加入到schedulersched.scheduleJob(job, trigger);

    然后啟動(dòng)schedulesched.start();

    這樣我們就可以看到日志中輸出的HelloWorld和它的執(zhí)行時(shí)間了。

    ?

    上面講的是他們最根本的應(yīng)用,當(dāng)然Quartz還有很多東西。

    比如Listener JobStore 等等。

    posted on 2006-11-24 10:19 漁人 閱讀(452) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 毛片a级毛片免费播放100| 亚洲精品成人无码中文毛片不卡| 国产精品视_精品国产免费| 亚洲色欲www综合网| 在线看片v免费观看视频777 | 久久九九免费高清视频| 亚洲一区二区三区免费| 亚洲第一页中文字幕| 午夜免费国产体验区免费的| 午夜免费啪视频在线观看| 亚洲成AV人片一区二区| 无码日韩精品一区二区三区免费 | 亚洲AV无码专区亚洲AV伊甸园| 日本道免费精品一区二区| 亚洲成在人天堂在线| 日本高清免费中文在线看| 99在线视频免费观看视频 | 亚洲精品V欧洲精品V日韩精品| 青柠影视在线观看免费高清| 亚洲一区二区在线免费观看| 永久免费毛片在线播放| 国产青草亚洲香蕉精品久久| 狠狠亚洲狠狠欧洲2019| 亚洲av日韩专区在线观看| 99久久99这里只有免费费精品| 亚洲一区二区观看播放| 亚洲国产高清精品线久久| 亚洲自偷自偷在线成人网站传媒| 永久免费bbbbbb视频| 亚洲综合无码一区二区痴汉| 免费国产精品视频| 成在人线av无码免费高潮喷水| 亚洲国产av美女网站| 久久免费看黄a级毛片| 国产精品久久久久久亚洲影视| 亚洲精品中文字幕无码蜜桃| 久久天天躁狠狠躁夜夜免费观看| 人人公开免费超级碰碰碰视频| 亚洲最新视频在线观看| 在线a亚洲v天堂网2018| 国产精品亚洲综合网站|