Quartz学习之多作业、监听

路由侠
• 阅读 2186

多作业例子

在这个例子中,我们将介绍如何通过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
点赞
收藏
评论区
推荐文章
作业帮上万个 CronJob 和在线业务混部,如何解决弱隔离问题并进一步提升资源利用率?
作者吕亚霖,作业帮基础架构架构研发团队负责人。负责技术中台和基础架构工作。在作业帮期间主导了云原生架构演进、推动实施容器化改造、服务治理、GO微服务框架、DevOps的落地实践。别路,作业帮基础架构高级研发工程师,在作业帮期间,负责多云K8s集群建设、K8s组件研发、Linux内核优化调优相关工作。背景作业帮在云原生容器化改造的过程中,随着
作业帮 Kubernetes 原生调度器优化实践
作者吕亚霖,2019年加入作业帮,作业帮架构研发负责人,在作业帮期间主导了云原生架构演进、推动实施容器化改造、服务治理、GO微服务框架、DevOps的落地实践。简介调度系统的本质是为计算服务/任务匹配合适的资源,使其能够稳定高效地运行,以及在此的基础上进一步提高资源使用密度,而影响应用运行的因素非常多,比如CPU、内存、IO、差异化的资源设备等等一系列因
TKE 用户故事 - 作业帮 PB 级低成本日志检索服务
作者吕亚霖,2019年加入作业帮,作业帮架构研发负责人,在作业帮期间主导了云原生架构演进、推动实施容器化改造、服务治理、GO微服务框架、DevOps的落地实践。莫仁鹏,2020年加入作业帮,作业帮高级架构师,在作业帮期间,推动了作业帮云原生架构演进,负责作业帮服务治理体系的设计和落地、服务感知体系建设以及自研mesh、MQproxy研发工作。摘要日志是服务
Easter79 Easter79
3年前
SpringBoot2.0高级案例(06):整合 QuartJob ,实现定时器实时管理
一、QuartJob简介1、一句话描述Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大。2、核心API(1)、Scheduler代表一个Quartz的独立运行容器,Scheduler将Trigger绑定到特定JobDetail,这样当Tri
Stella981 Stella981
3年前
Quartz开源作业调度框架原理及使用Quartz实现定时订单测试
QuartzQuartz是OpenSymphony开源组织在Jobscheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或EJBs。Quartz
Wesley13 Wesley13
3年前
Java日期时间API系列29
  Java开发过程中经常会用到定时任务job的场景,比如定时处理数据报表等问题,开源作业调度框架也非常多,常用的开源作业调度框架有:SpringTask、Quartz和xxljob等。各个框架的具体使用不再这里讨论,这里主要讨论一下其中cron表达式的计算应用,xktime中的应用。1.SpringTask中cron表达式的计算应用
Stella981 Stella981
3年前
SpringBoot2.0高级案例(06):整合 QuartJob ,实现定时器实时管理
一、QuartJob简介1、一句话描述Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大。2、核心API(1)、Scheduler代表一个Quartz的独立运行容器,Scheduler将Trigger绑定到特定JobDetail,这样当Tri
Easter79 Easter79
3年前
Spring的业务层和Web层
任务调度  quartz框架  quartz框架实现了Spring的任务调度,用户可以随意的定义触发器调度时间表,并将触发器和任务进行映射。quartz通过调度器、触发器和任务实现任务调度。  Job:主要用来设计任务实现的逻辑,并且只有一个方法execute。  JobDetail:主要用来通过newInst
Stella981 Stella981
3年前
Python任务调度模块 – APScheduler
APScheduler是一个Python定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务、并以daemon方式运行应用。目前最新版本为3.0.x。在APScheduler中有四个组件:触发器(trigger)包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行
Quartz核心原理之架构及基本元素介绍 | 京东物流技术团队
1什么是QuartzQuartz是一个作业调度框架,它可以与J2EE和J2SE应用相结合,也可以单独使用。它能够创建多个甚至数万个jobs这样复杂的程序,jobs可以做成标准的java组件或EJBS。Quartz很容易上手,创建一个任务仅需实现Job接口,
邢德全 邢德全
1年前
万界星空科技MES系统中的生产调度流程
MES系统生产调度的目标是达到作业有序、协调、可控和高效的运行效果,作业计划的快速生成以及面向生产扰动事件的快速响应处理是生产调度系统的核心和关键。