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的信息之外,还可以获取运行的相应信息,


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

相关文章
|
消息中间件 存储 Kafka
Flink---11、状态管理(按键分区状态(值状态、列表状态、Map状态、归约状态、聚合状态)算子状态(列表状态、广播状态))
Flink---11、状态管理(按键分区状态(值状态、列表状态、Map状态、归约状态、聚合状态)算子状态(列表状态、广播状态))
|
6月前
|
前端开发 Java 定位技术
生活小事件(SpringMVC主要的组件及作用和执行流程)
Spring MVC 的主要组件包括 DispatcherServlet(核心,请求调度)、HandlerMapping(URL 映射到处理器)、HandlerAdapter(统一执行处理器)、Handler(处理业务逻辑,通常为 @Controller 类)、ViewResolver(视图解析)和 View(渲染输出)。通过这些组件的协作,Spring MVC 实现了从接收请求到返回响应的流程,类似于警察处理交通违规的协调过程。
quartz(二)动态增删改查停止启用job
quartz(二)动态增删改查停止启用job
63 0
|
XML SQL Java
Flowable 设置任务处理人的四种方式
Flowable 设置任务处理人的四种方式
1030 1
activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便
activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便
1170 0
activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便
|
Java Android开发
JobService源码探究之 onStartJob()里执行耗时逻辑导致Job可能被强制销毁
JobService源码探究之 onStartJob()里执行耗时逻辑导致Job可能被强制销毁
|
前端开发 开发者
介绍有状态组件和无状态组件的区别|学习笔记
快速学习介绍有状态组件和无状态组件的区别
189 0
|
前端开发
介绍有状态组件和无状态组件的区别
介绍有状态组件和无状态组件的区别
Quartz传递数据和有无状态Job(三)下
Quartz传递数据和有无状态Job(三)下
306 0
Quartz传递数据和有无状态Job(三)下
|
Java Spring
异步调用为什么要复制线程上下文信息?
异步调用为什么要复制线程上下文信息?
186 0
异步调用为什么要复制线程上下文信息?