Quartz入门Demo(三)之TriggerListener 和 JobListener

介绍

Quartz框架是一个全功能、开源的任务调度服务,可以集成几乎任何的Java应用程序—从小的单片机系统到大型的电子商务系统。Quartz可以执行上千上万的任务调度。

TriggerListener

TriggerListener 是一个监听器,用于监听Trigger。可以通过实现TriggerListener重写各方法进行使用。

方法说明
getName()定义并返回监听器的名字
triggerFired()当与监听器相关联的 Trigger 被触发,Job 上的 execute() 方法将要被执行时,Scheduler 就调用这个方法。在全局 TriggerListener 情况下,这个方法为所有 Trigger 被调用。
vetoJobExecution()在Trigger 触发后,Job 将要被执行时由 Scheduler 调用这个方法。TriggerListener 给了一个选择去否决 Job 的执行。假如这个方法返回 true,这个 Job 将不会为此次 Trigger 触发而得到执行
triggerMisfired()Scheduler 调用这个方法是在 Trigger 错过触发时。如这个方法的 JavaDoc 所指出的,你应该关注此方法中持续时间长的逻辑:在出现许多错过触发的 Trigger 时,长逻辑会导致骨牌效应。你应当保持这上方法尽量的小。
triggerComplete()Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个方法。这不是说这个 Trigger 将不再触发了,而仅仅是当前 Trigger 的触发(并且紧接着的 Job 执行) 结束时。这个 Trigger 也许还要在将来触发多次的。

JobListener

JobListener是用于监听Job状态的监听器

方法说明
getName()定义并返回监听器的名字
jobToBeExecuted()在Job执行前调用
jobExecutionVetoed()Job被否决运行后调用
jobWasExecutedJob完成后调用

直接上代码

JobListenerDemo类

package com.v.listenertest;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JobListenerDemo implements JobListener {
    Logger _log = LoggerFactory.getLogger(JobListenerDemo.class);
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return "MyJobListener";
    }

    @Override
    public void jobToBeExecuted(JobExecutionContext context) {
        // TODO Auto-generated method stub
        _log.info(" Job 被触发了,此时Job 上的 execute() 方法将要被执行");
    }

    @Override
    public void jobExecutionVetoed(JobExecutionContext context) {
        // TODO Auto-generated method stub
        _log.info("执行任务被否决了!");
    }

    @Override
    public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
        // TODO Auto-generated method stub
        _log.info("Job 的执行完成了,此方法被调用----"+context.getJobDetail().getKey());
    }

}

TriggerListenerDemo类

package com.v.listenertest;

import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.Trigger.CompletedExecutionInstruction;
import org.quartz.TriggerListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class TriggerListenerDemo implements TriggerListener{
    Logger _log = LoggerFactory.getLogger(TriggerListenerDemo.class);
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return "MyTriggerListener";
    }

    @Override
    public void triggerFired(Trigger trigger, JobExecutionContext context) {
        // TODO Auto-generated method stub
        _log.info(" Trigger 被触发了,此时Job 上的 execute() 方法将要被执行");
    }

    @Override
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
        // TODO Auto-generated method stub
        //返回false表示执行任务
        _log.info("拒绝执行任务!");
        return true;
    }

    @Override
    public void triggerMisfired(Trigger trigger) {
        // TODO Auto-generated method stub
        _log.info("当前触发错过了!");
    }

    @Override
    public void triggerComplete(Trigger trigger, JobExecutionContext context,
            CompletedExecutionInstruction triggerInstructionCode) {
        // TODO Auto-generated method stub
        _log.info("Trigger 被触发并且完成了 Job 的执行,此方法被调用----"+trigger.getKey());
    }

}

test类

package com.v.listenertest;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Matcher;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.quartz.TriggerListener;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher;

import com.v.paramtest.HelloJob2;

public class test {
    public static SimpleTrigger trigger1,trigger2 = null;

    public static void main(String[] args) {
        trigger1 = newTrigger().withIdentity("trigger1", "group1").startAt(new Date()).withSchedule(simpleSchedule()
                .withIntervalInSeconds(20).withRepeatCount(5).withMisfireHandlingInstructionNowWithExistingCount())
                .build();
        trigger2 = newTrigger().withIdentity("trigger2", "group2").startAt(new Date()).withSchedule(simpleSchedule()
                .withIntervalInSeconds(20).withRepeatCount(5).withMisfireHandlingInstructionNowWithExistingCount())
                .build();
        test1(trigger1,trigger2);
    }

    public static void test1(Trigger trigger1,Trigger trigger2) {
        try {
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            Scheduler scheduler = null;
            scheduler = schedulerFactory.getScheduler();
            JobDetail job1 = newJob(HelloJob2.class).withIdentity("job1", "group1").build();
            JobDetail job2 = newJob(HelloJob2.class).withIdentity("job2", "group2").build();
            TriggerListenerDemo lisntener = new TriggerListenerDemo();
            JobListenerDemo jobListener = new JobListenerDemo();
//          直接添加为全局监听器
//          scheduler.getListenerManager().addTriggerListener(lisntener);
            Matcher<TriggerKey> matcher1 = KeyMatcher.keyEquals(trigger1.getKey());//局部监听
            scheduler.getListenerManager().addTriggerListener(lisntener, matcher1);
            Matcher<JobKey> matcher2 = KeyMatcher.keyEquals(job1.getKey());//局部监听
            scheduler.getListenerManager().addJobListener(jobListener, matcher2);
            job1.getJobDataMap().put("ExecutionDelay", 1000L);
            job2.getJobDataMap().put("ExecutionDelay", 1000L);
            scheduler.scheduleJob(job1, trigger1);
            scheduler.scheduleJob(job2, trigger2);
            scheduler.start();
        } catch (Exception se) {
            se.printStackTrace();
        }
    }
}

监听器可注册为局部监听和全局监听,全局监听顾名思义,TiggerListener则是监听所有Trigger。Job同理。

附上Demo:QuartzDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值