您的位置:首页 > 编程语言 > Java开发

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

2018-01-18 00:00 609 查看
摘要: java EE开发

一、浅谈Job和JobDetail

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

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

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

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

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

name:jobDetail.getKey().getName();

group:(默认DEFAULT组)jobDetail.getKey().getGroup();

jobClass:jobDetail.getJobClass().getName();

二、浅谈JobExecutionContext与JobDataMap

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

2、JobDataMap:

在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取;

JobDataMap可以用来装载任何可序列化的数据对象,当Job实例对象被执行时这些参数对象会传递给它;

JobDataMap实现了JDK的Map接口,并且添加了一些非常方便的方法来存取基本数据类型;

3、获取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())
 
7fe0
;                .build();

B--获取数据:

方法一: 从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


三、浅谈Trigger

JobKey:job实例的标识,触发器被触发时,该指定的job实例会被执行

StartTime:触发器的时间表首次被触发的时间,类型java.util.Date

EndTime:指定触发器不再被触发的时间,类型Date

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

.withShedule(

SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds()

)


CornTrigger:(常用)基于日历的作业调度器

.withShedule(

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

)

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

四、浅谈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表示直接关闭 ,也可空。

五、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信息是如何被存储的

插件配置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Quartz