资讯专栏INFORMATION COLUMN

Quartz学习之多作业、监听

miracledan / 889人阅读

摘要:多作业例子在这个例子中,我们将介绍如何通过多个作业。在调度框架中,每个作业将被连接到一个唯一的触发,并且由调度器运行它。备注说明在中,一个触发器触发多个作业是不可以的。第一步创建个作业,,和。

多作业例子

在这个例子中,我们将介绍如何通过Quartz API 多个作业。在Quartz调度框架中,每个作业将被连接到一个唯一的触发,并且由调度器运行它。

备注说明:在 Quartz 中,一个触发器触发多个作业是不可以的。

第一步:创建3个作业,JobA,JobB和JobC。

JobA.class

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class JobA implements Job{

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("Job A is runing //every 5 seconds ");
    }

}

JobB.class

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class JobB implements Job{

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("Job B is runing");
    }

}

JobC.class

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class JobC implements Job{

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("Job C is runing");
    }
}
第二步:使用QuartzAPI声明上述3个作业,分配它们到特定触发器并调度它。
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

// 这里引入自己的Job 的地址
import com.demo.quartz.job.JobA;
import com.demo.quartz.job.JobB;
import com.demo.quartz.job.JobC;

public class CronTriggerMultiJob {

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

        JobKey jobKeyA = new JobKey("JobA", "group1");
        JobDetail jobA = JobBuilder.newJob(JobA.class).withIdentity(jobKeyA)
                .build();

        JobKey jobKeyB = new JobKey("JobB", "group1");
        JobDetail jobB = JobBuilder.newJob(JobB.class).withIdentity(jobKeyB)
                .build();

        JobKey jobKeyC = new JobKey("JobC", "group1");
        JobDetail jobC = JobBuilder.newJob(JobC.class).withIdentity(jobKeyC)
                .build();

        Trigger trigger1 = TriggerBuilder
                .newTrigger()
                .withIdentity("dummyTriggerName1", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();

        Trigger trigger2 = TriggerBuilder
                .newTrigger()
                .withIdentity("dummyTriggerName2", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();

        Trigger trigger3 = TriggerBuilder
                .newTrigger()
                .withIdentity("dummyTriggerName3", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();
        
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
         
        scheduler.start();
        scheduler.scheduleJob(jobA, trigger1);
        scheduler.scheduleJob(jobB, trigger2);
        scheduler.scheduleJob(jobC, trigger3);
    }
}

输出的结果如下

Job A is runing //every 5 seconds
Job B is runing
Job C is runing
Job A is runing //every 5 seconds
Job B is runing
Job C is runing
监听例子

在这个例子中,我们回学到如何创建一个 JobListener, 跟踪运行工作状态在作业完成。

第一步:创建一个作业,并在作业中抛出一个异常(JobExecutionException)

HelloJob.java

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job{

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("Hello Quartz!");
        
        throw new JobExecutionException("Testing Exception");
    }
}
第二步:创建监听

HelloJobListener.java

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;

public class HelloJobListener implements JobListener {

    public static final String LISTENER_NAME = "dummyJobListenerName";

    @Override
    public String getName() {
        return LISTENER_NAME; // 必须要返回一个监听的名字
    }

    /**
     * 当 job 执行的时候会调用这个方法
     */
    @Override
    public void jobExecutionVetoed(JobExecutionContext context) {
        String jobName = context.getJobDetail().getKey().toString();
        System.out.println("jobToBeExecuted");
        System.out.println("Job : " + jobName + " is going to start...");

    }

    @Override
    public void jobToBeExecuted(JobExecutionContext context) {
        System.out.println("jobExecutionVetoed");
    }

    /**
     * job 执行后运行
     */
    @Override
    public void jobWasExecuted(JobExecutionContext context,
            JobExecutionException jobException) {
        System.out.println("jobWasExecuted");

        String jobName = context.getJobDetail().getKey().toString();
        System.out.println("Job : " + jobName + " is finished...");

        if (!jobException.getMessage().equals("")) {
            System.out.println("Exception thrown by: " + jobName
                    + " Exception: " + jobException.getMessage());
        }
    }

}
第三步:测试执行

HelloJobListenerTest.java

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher;

public class HelloJobListenerTest {

    public static void main(String[] args) throws Exception {
        
        // 新建一个jobKey
        JobKey jobKey = new JobKey("dummyJobName", "group1");    // name dummyJobName  group group1
        JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity(jobKey)
                .build();

        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("dummyTriggerName", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))    // 每5秒执行一次
                .build();

        Scheduler scheduler = new StdSchedulerFactory().getScheduler();

        // 添加 监听到 jobKey
        scheduler.getListenerManager().addJobListener(new HelloJobListener(),
                KeyMatcher.keyEquals(jobKey));

        scheduler.start();
        scheduler.scheduleJob(job, trigger);

    }
}

输出结果

jobExecutionVetoed
Hello Quartz!
五月 26, 2018 3:23:15 下午 org.quartz.core.JobRunShell run
信息: Job group1.dummyJobName threw a JobExecutionException: 
org.quartz.JobExecutionException: Testing Exception
    at com.wq.study.quartz.HelloJob.execute(HelloJob.java:14)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)

jobWasExecuted
Job : group1.dummyJobName is finished...
Exception thrown by: group1.dummyJobName Exception: Testing Exception

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71247.html

相关文章

  • Quartz习之入门

    摘要:触发器也可以给予名称和放置在组中,以方便地将它们调度内组织。作业可以被添加到所述调度器一次,而是具有多个触发器注册。调度类链接工作和触发器到一起,并执行它。 简介 Quartz是一个开源的作业调度框架,可以让计划的程序任务一个预定义的日期和时间运行。Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至是十万的作业数。官方链接,戳这里 Quartz是什么? 作业调度库 Qua...

    Pandaaa 评论0 收藏0
  • Quartz习之常用Trigger方法记录

    摘要:分类中共包含有种触发器。建立一个触发器,每隔一分钟,每天上午点至下午点之间建立一个触发器,将在每天上午执行第一种实现方式第二种实现方式建立一个触发器,将在星期三上午在系统默认值之外执行第一种方式第二种方式 Trigger分类 Quartz中共包含有4种触发器。 常用的是: SimpleTrigger 和 CronTrigger。不常用的是:CalendarIntervalTrigger...

    vibiu 评论0 收藏0
  • Quartz习之Cron Expressions表达式

    摘要:请注意,触发器将不会在上午点开始,仅在,,和请注意,一些调度要求太复杂,无法用单一触发表示例如每上午至之间每分钟,下午至晚上点之间每分钟一次。在这种情况下的解决方案是简单地创建两个触发器,并注册它们来运行相同的作业。 表达式说明 Cron-Expressions 用于配置 CronTrigger的实例。Cron Expressions 是由七个子表达式组成的字符串,用于描述日程表的各个...

    Mr_zhang 评论0 收藏0
  • 【Java定时任务调度工具】Quartz

    摘要:例如在周上设置表示周一三五触发用于递增触发。例如在周上设置,表示本月的最后一个星期五表示离指定日期最近那个工作日周一至周五,例如在日字段上设置,表示离每月号最近的那个工作日触发。相关例子代码较简单的定时任务调度工具利用集成 笔记来源:IMOOC Java Quartz Quartz 简介 OpenSymphony 提供的强大的开源任务调度框架 纯 Java 实现,精细控制排程 Q...

    Render 评论0 收藏0
  • Quartz 2 定时任务(三):异常与中断处理

    摘要:注意为了共享在同一个中的,我们需要在上面这个实现类上加入和注解,详见定时任务二多线程并发执行与数据共享。捕获异常,取消所有触发器在我们捕获异常时,可以调用取消所有与这个作业有关的触发器。 版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009141079 1. 作业异常 org.quartz.JobExecut...

    Hydrogen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<