文档章节

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

nutsKevin
 nutsKevin
发布于 2018/01/18 20:35
字数 1233
阅读 65
收藏 1

一、浅谈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())
                    .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

  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

 

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

插件配置

 

 

© 著作权归作者所有

nutsKevin
粉丝 0
博文 3
码字总数 2078
作品 0
厦门
私信 提问
分布式定时任务框架---Uncode Schedule

分布式定时任务框架---Uncode Schedule rabbitGYK 关注 2016.11.27 20:36* 字数 1446 阅读 7141评论 5喜欢 36赞赏 1 博客原文 作为一个支付公司的项目组,经常会有很多对账功能(签约对账、支...

晨猫
2018/11/02
135
0
SpringBoot | 第二十二章:定时任务的使用

前言 上两章节,我们简单的讲解了关于异步调用和异步请求相关知识点。这一章节,我们来讲讲开发过程也是经常会碰见的定时任务。比如每天定时清理无效数据、定时发送短信、定时发送邮件、支付...

oKong
2018/08/19
1K
3
java web项目如何备份mysql数据库。

java web项目如何备份mysql数据库。 先说说,我想干什么:我想在java web项目运行时,定时备份数据库生成hello.sql,并将此文件放入到项目的主目录下。 我的项目使用了spring,spring mvc,hib...

change_solider
2014/07/12
2.4K
2
Spring定时任务的几种实现

Spring定时任务的几种实现 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,...

Sandy_wu
2013/07/09
442
1
SpringBoot整合Quartz定时任务

(1)什么是Quartz? (2)Quartz的特点; (3)Quartz专用词汇说明; (4)Quartz任务调度基本实现原理; 接下来看下具体的内容: (1)什么是Quartz? Quartz是一个完全由Java编写的开源作业...

weixin_38655836
2018/04/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

spring boot actuator

actuator 是监控系统健康的工具,引入 spring-boot-starter-actuator会暴露一些endpoint. 可通过如下配置来配置这些endpoint的基本配置: 可通过http:${url}:28081/management/actuator/*来访...

ZH-JSON
18分钟前
3
0
9.特殊权限 软连接 硬链接

6月7日任务 2.18 特殊权限set_uid 2.19 特殊权限set_gid 2.20 特殊权限stick_bit 2.21 软链接文件 2.22 硬连接文件 2.18 特殊权限set_uid 会发现有些文件的前三位并不是rwx而是rws,而s就代表...

oschina130111
30分钟前
2
0
好程序员web前端分享如何自学前端?步骤是什么?

好程序员web前端分享如何自学前端?步骤是什么?简单粗暴直接上学习流程。 1、学习HTML+CSS基础 HTML5新特性和CSS3 这个部分主要是需要记忆的知识点比较多,建议大家在学习的时候多加练习,最...

好程序员官方
31分钟前
3
0
创龙基于TI TMS320C6748定点/浮点DSP C674x + Xilinx Spartan-6 FPGA开发板

TL6748F-EVM是一款基于广州创龙SOM-TL6748F核心板设计的开发板,底板采用沉金无铅工艺2层板设计,它为用户提供了SOM-TL6748F核心板的测试平台,用于快速评估SOM-TL6748F核心板的整体性能。 ...

Tronlong创龙
37分钟前
2
0
8年前诞生于淘宝,细数阿里云RPA 的前世今生

9月10日,踏入55岁的马云正式卸任阿里巴巴董事局主席一职,由阿里巴巴集团CEO张勇接任。公寓创业、西湖论剑、美国敲钟,从成立到登顶中国最值钱的公司,阿里巴巴只用了20年。 阿里云RPA,201...

阿里云官方博客
41分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部