一. 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(); } }
一.三 控制台打印
运行程序,控制台打印输出:
每一次,都重新执行构造方法,并且打印出的内存地址也不一致,
结论: 可以知道, 每一次执行作业,都会重新实例化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(); } }
二.一.三 控制台打印
只能获取到最基本的数据信息。
二.二 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(); } }
二.二.三 控制台打印输出
通过 JobExecutionContext 除了可以获取 JobDetail 和Trigger的信息之外,还可以获取运行的相应信息,
如当前运行的时候,下一次运行的时间等。