Java 定时任务调度工具 Quartz(Part 2)

1、浅谈Job和JobDetail

一、Job接口:实现业务逻辑的任务接口,execute方法中实现具体逻辑(相似与TimerTask的run方法),html

    1.1 Job实例在Quartz中的生命周期:java

    每次调度器执行Job时,它在调用execute方法前会建立一个新的job实例,当调用完成后,关联的job对象实例被释放,释放的实例会被垃圾回收机制回收。框架

 

二、JobDetail(绑定job,又携带须要使用的属性):为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,他用来存储特定Job实例的状态信息,调度器须要借助JobDetail对象来添加Job实例。函数

    2.1 重要属性:name/group/jobClass/jobDataMapui

  • name:jobDetail.getKey().getName();
  • group:(默认DEFAULT组)jobDetail.getKey().getGroup();
  • jobClass:jobDetail.getJobClass().getName();

2、浅谈JobExecutionContext与JobDataMap

一、JobExecutionContext:当scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法;Job能经过JobExecutionContext对象访问到Quartz运行时候的环境以及job自己的明细数据。this

二、JobDataMap:spa

  • 在进行任务调度时JobDataMap存储在JobExecutionContext中,很是方便获取;
  • JobDataMap能够用来装载任何可序列化的数据对象,当Job实例对象被执行时这些参数对象会传递给它;
  • JobDataMap实现了JDK的Map接口,而且添加了一些很是方便的方法来存取基本数据类型;

三、获取JobdataMap的两种方式:插件

    A--数据赋值:链式写法:线程

JobDetail jobDetail = JobBuilder
                    .newJob(HelloJob.class)
                    .withIdentity("myJob", "group1")
                    .usingJobData("param", "myTestJob")
                    .usingJobData("jobDetailValue",3.14F)
                    .build();

    Trigger trigger = TriggerBuilder
                    .newTrigger()
                    .withIdentity("myTrigger", "group1")
                    .startNow().
                    usingJobData("param","myTestTrigger").
                    usingJobData("TriggerValue",3.1D)
                    .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever())
                    .build();

B--获取数据:code

   方法一: 从Map中直接获取:

(1)arg0.getTrigger().getJobDataMap()和arg0.getJobDetail().getJobDataMap();

public void execute(JobExecutionContext arg0) throws JobExecutionException {
		//打印当前的执行时间
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("Current Exec Time is:"+sdf.format(date));
		
		//编写具体的业务逻辑
		//A经过Map-取数方法1
		JobKey jobKey=arg0.getJobDetail().getKey();
		TriggerKey triggerKey = arg0.getTrigger().getKey(); 
		JobDataMap jobDataMap =arg0.getJobDetail().getJobDataMap();
		JobDataMap triggerDataMap = arg0.getTrigger().getJobDataMap();
		
		System.out.println("Job name:"+jobKey.getName()+"-Job Group:"+jobKey.getGroup());
		System.out.println("Trigger name:"+triggerKey.getName()+"-Trigger Group:"+triggerKey.getGroup());
		System.out.println("Jobparam:"+jobDataMap.getString("param"));
		System.out.println("jobDetailValue:"+jobDataMap.getFloat("jobDetailValue"));
		System.out.println("triggerparam:"+triggerDataMap.getString("param"));
		System.out.println("TriggerValue:"+triggerDataMap.getDouble("TriggerValue"));
}

(2)getMergedJobDataMap()方法(key相同时,Trigger优先于JobDetail)

JobDataMap DataMap = arg0.getMergedJobDataMap();
	 	System.out.println("param:"+DataMap.getString("param"));

 

    方法二:Job实现类中添加setter方法对应JobDataMap的键值(Quartz框架默认的JobFactory实现类在初始化job实例对象时会自动调用这些setter方法)

    添加同名私有变量,写setter方法

public class HelloJob implements Job{
	private String param;
	private Double TriggerValue;
	private Float jobDetailValue;
	
	public void setParam(String param) {
		this.param = param;
	}
	public void setTriggerValue(Double triggerValue) {
		TriggerValue = triggerValue;
	}
	public void setJobDetailValue(Float jobDetailValue) {
		this.jobDetailValue = jobDetailValue;
	}
}

 

    利用实例化时的反射机制,settet()自动赋值

//经过setter方法获取数据
		System.out.println("param:"+param);
		System.out.println("jobDetailValue:"+TriggerValue);
		System.out.println("TriggerValue:"+jobDetailValue);

 

    运行结果:

Current Exec Time is:2018-01-18 20:13:02
param:myTestTrigger
jobDetailValue:3.1
TriggerValue:3.14
Current Exec Time is:2018-01-18 20:13:03
param:myTestTrigger
jobDetailValue:3.1
TriggerValue:3.14

3、浅谈Trigger

  1. JobKey:job实例的标识,触发器被触发时,该指定的job实例会被执行
  2. StartTime:触发器的时间表首次被触发的时间,类型java.util.Date
  3. EndTime:指定触发器再也不被触发的时间,类型Date

SimpleTrigger:在一个指定的时间内执行一次做业任务,或在指定时间间隔屡次执行任务
   

.withShedule(

            SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds()

            )

 

CornTrigger:(经常使用)基于日历的做业调度器   

 .withShedule(

              CronScheduleBuilder.cronSchedule("* * * * * ? *")//cron表达式

)

cron表达式:https://www.cnblogs.com/sunjie9606/archive/2012/03/15/2397626.html

 

4、浅谈Scheduler

  • 全部的Scheduler实例应该由SchedulerFactory来建立、
  • SchedulerFactory有两种实现类:StdShedulerFactory(声明式配置,经常使用)和DirectSchedulerFactory(需在代码中配置参数,不经常使用)
  • Scheduler的建立方式
    //StdSchedulerFactory工厂类(经常使用)
    SchedulerFactory sfact = new StdSchedulerFactory();
    Scheduler scheduler = sfact.getScheduler();
    
    //DirectSchedulerFactory工厂类
    DirectSchedulerFactory factory= DirectSchedulerFactory.getInstance();
    Scheduler scheduler = factory.getScheduler();

    StdShedulerFactory:

  • 使用一组参数(java.util.Properties)来建立和初始化Quartz调度器;
  • 配置文件指定线程数和参数获取方式等配置信息,配置参数通常存储在quartz.properties中;
  • 调用getScheduler方法就能建立和初始化调度器对象

       Sheduler的主要函数:

  • Date ScheduleJob(JobDetail jobDetail,Trigger trigger)    //返回值是最近一次即将执行的时间 
  • void start()
  • void standby()                        //执行2秒后自动挂起
  • Thread.sleep(2000L);
    scheduler.standby();
    void shutdown(Boolean boolean) // true表示等待全部正在执行的Job执行完毕以后再关闭,false表示直接关闭 ,也可空。           

5、Quartz.properties文件

    文档的位置和加载顺序:优先读取用户自定义的quartz.properties,若无则读取Jar包里面的配置文件

    组成部分:调度器属性/线程池属性/做业存储设置/插件配置

 

调度器属性:

  • org.quartz.scheduler.instanceName属性用于区分特定的调度器实例,可按功能命名。
  • org.quartz.scheduler.instanceId 同上,可是必须在全部调度器实例中惟一,可为AUTO

线程池属性:

  • threadCount:10左右
  • threadPriority:优先级(default 5)
  • org.quartz.threadPool.class

做业存储设置:Job和Trigger信息是如何被存储的

插件配置

相关文章
相关标签/搜索