Quartz传递数据和有无状态Job(三)

简介: Quartz传递数据和有无状态Job(三)

一. Job的实例化


在多次重复执行Job对象时,是每一次运行都重新实例化,生成新的Job对象呢,还是一直用同一个Job对象呢?


我们用例子来观察一下。


例子均与第一章节的例子差不多。 因本章节代码过多,故只复制出主要代码。(多次复制代码,是为了加深印象)


一.一 创建 MyJob2,实现Job 接口

//  Description: 看对象的实例化状态
public class MyJob2 implements Job {
    public MyJob2() {
        //每次都会重新构建,创建新的对象
        System.out.println("构建MyJob2 对象");
    }
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
      System.out.println("输出当前的对象信息:"+this.toString());
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString=sdf.format(new Date());
        System.out.println("正在备份数据库:"+dateString);
    }
}


一.二 主程序运行

public class SchedulerDemo2 {
    public static void main(String[] args) throws  Exception{
        //创建 Scheduler 实例
        Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler();
        //创建Job
        JobDetail jobDetail= JobBuilder.newJob(MyJob2.class)
                .withIdentity("job1","group1")
                .build();
        //创建 Trigger
        Trigger trigger= TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1")
    //立即启动
                .startNow()
    //重复执行,每两秒执行一次
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2))
                .build();
        //关联一下
        scheduler.scheduleJob(jobDetail,trigger);
        //启动
        scheduler.start();
    }
}


一.三 控制台打印

运行程序,控制台打印输出:

image.png

每一次,都重新执行构造方法,并且打印出的内存地址也不一致,


结论: 可以知道, 每一次执行作业,都会重新实例化Job对象。


二. 运行中的作业调度的相关信息


作业调度在运行中,我们可以获取哪些信息呢?


二.一 JobDetail 和TriggerKey 在主程序中获取

主程序在运行时,可以获取相应 jobDetail和trigger的信息


二.一.一 工作任务

//展示信息
public class MyJob3 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString=sdf.format(new Date());
        System.out.println("正在备份数据库:"+dateString);
    }
}


二.一.二 主程序

public class SchedulerDemo3 {
    public static void main(String[] args) throws  Exception{
        //创建 Scheduler 实例
        Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler();
        //创建Job
        JobDetail jobDetail= JobBuilder.newJob(MyJob3.class)
          //设置编号和组名 
                .withIdentity("job1","group1")
                .build();
        //获取相应的信息
        System.out.println("名称:"+jobDetail.getKey().getName());
        //组名如果不写的话,默认是 DEFAULT
        System.out.println("组名:"+jobDetail.getKey().getGroup());
        //获取运行的类
        System.out.println("类名:"+jobDetail.getJobClass().getName());
        //创建 Trigger
        Trigger trigger= TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2))
                .build();
        System.out.println("名称:"+trigger.getKey().getName());
        System.out.println("组名:"+trigger.getKey().getGroup());
        //关联一下
        scheduler.scheduleJob(jobDetail,trigger);
        //启动
        scheduler.start();
    }
}


二.一.三 控制台打印

image.png


只能获取到最基本的数据信息。

二.二 JobExecutionContext 获取运行中的信息

二.二.一 工作任务


通过 JobExecutionContext对象来获取 JobDetail 和 Trigger, 从而获取设置信息。

//展示运行中的信息
public class MyJob4 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         String dateString=sdf.format(new Date());
         //通过 jobExecutionContext 来获取对象
         JobKey jobKey=jobExecutionContext.getJobDetail().getKey();
         System.out.println("名称:"+jobKey.getName());
         System.out.println("组名:"+jobKey.getGroup());
         System.out.println("类名:"+jobExecutionContext.getJobDetail().getJobClass().getName());
         System.out.println("简单类名:"+jobExecutionContext.getJobDetail().getJobClass().getSimpleName());
         //获取 Trigger 的信息
         Trigger trigger=jobExecutionContext.getTrigger();
         System.out.println("Trigger名称:"+trigger.getKey().getName());
         System.out.println("Trigger组名:"+trigger.getKey().getGroup());
         //获取运行时信息
         System.out.println("当前执行时间:"+sdf.format(jobExecutionContext.getFireTime()));
         System.out.println("下一次执行时间:"+sdf.format(jobExecutionContext.getNextFireTime()));
         System.out.println("正在备份数据库:"+dateString);
    }
}


二.二.二 主程序

//工作任务中获取信息
public class SchedulerDemo4 {
    public static void main(String[] args) throws  Exception{
        //创建 Scheduler 实例
        Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler();
        //创建Job
        JobDetail jobDetail= JobBuilder.newJob(MyJob4.class)
          //设置编号和组名 
                .withIdentity("job1","group1")
                .build();
        //创建 Trigger
        Trigger trigger= TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2))
                .build();
        //关联一下
        scheduler.scheduleJob(jobDetail,trigger);
        //启动
        scheduler.start();
    }
}


二.二.三 控制台打印输出

image.png


通过 JobExecutionContext 除了可以获取 JobDetail 和Trigger的信息之外,还可以获取运行的相应信息,


如当前运行的时候,下一次运行的时间等。

相关文章
|
8月前
|
消息中间件 存储 Kafka
Flink---11、状态管理(按键分区状态(值状态、列表状态、Map状态、归约状态、聚合状态)算子状态(列表状态、广播状态))
Flink---11、状态管理(按键分区状态(值状态、列表状态、Map状态、归约状态、聚合状态)算子状态(列表状态、广播状态))
|
10月前
quartz(二)动态增删改查停止启用job
quartz(二)动态增删改查停止启用job
37 0
|
XML SQL Java
Flowable 设置任务处理人的四种方式
Flowable 设置任务处理人的四种方式
|
SQL 存储 数据库
Flowable 设置流程变量的四种方式
Flowable 设置流程变量的四种方式
|
Python
FastAPI(35)- 依赖项中使用 yield + Context Manager 上下文管理器
FastAPI(35)- 依赖项中使用 yield + Context Manager 上下文管理器
267 0
|
Java Android开发
JobService源码探究之 onStartJob()里执行耗时逻辑导致Job可能被强制销毁
JobService源码探究之 onStartJob()里执行耗时逻辑导致Job可能被强制销毁
|
前端开发 开发者
介绍有状态组件和无状态组件的区别|学习笔记
快速学习介绍有状态组件和无状态组件的区别
146 0
|
前端开发
介绍有状态组件和无状态组件的区别
介绍有状态组件和无状态组件的区别
|
存储 算法 Unix
bthread源码剖析(四): 通过ParkingLot实现Worker间任务状态同步
通过之前的文章我们知道TaskGroup(以下简称TG)是在死循环等待任务,然后切换栈去执行任务。在当前TG没有任务的时候会进行“工作窃取”窃取其他TG的任务。在没有任务的时候TG会“休眠”,当任务出现的时候被唤醒然后消费。
259 0
|
监控 Java Android开发
【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )
【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )
173 0