quartz任务调度(quartz集群任务调度)

http://www.itjxue.com  2023-02-15 09:49  来源:未知  点击次数: 

java怎么使用quartz任务调度传一些集合数组

可以使用JobDataMap来传递集合数组,JobDataMap是Quartz提供的一个Map,可以用来存储任务相关的数据。

在调度任务时,可以使用JobDataMap来传递集合数组:

JobDetail jobDetail = newJob(MyJob.class)

.withIdentity("myJob", "group1")

.usingJobData("myCollection", myCollection)

.build();

// 在任务中获取集合数组

@Override

public void execute(JobExecutionContext context) throws JobExecutionException {

JobDataMap dataMap = context.getJobDetail().getJobDataMap();

ListString myCollection = (ListString) dataMap.get("myCollection");

// do something with myCollection

}

quartz作业调度的应用和原理

Quartz是一款由java写成的作业调度框架,在大量javase/javaee应用中被用来做定时任务,它功能强大而又不失使用简单性。

Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。

1、Job

表示一个工作,要执行的具体内容。此接口中只有一个方法

void execute(JobExecutionContext context)

线程运行Job时会把JobDataMap封装到JobExecutionContext里作为execute方法的参数,jobdetail是对job的封装,里面有Job的class,对应的数据, 名称,分组等

2、JobDetail

JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。

3、Trigger代表一个调度参数的配置,job下次什么时候执行存放在trigger中。

4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。

5、QuartzSchedulerResources相当于调度的资源存放器,包含了JobStore, ThreadPool等资源,调度都是通过QuartzSchedulerResources获取相关属性的。

6、jobStore是任务和触发器存储地方,它里面提供大量类似于增删改的操作任务方法。

5、QuartzSchedulerThread是一个调度线程,ThreadPool是一个执行线程池,下图是运行后的线程栈:

Quartz是通过对用户暴露出Scheduler来进行任务的操作,它可以把任务JobDetail和触发器Trigger加入任务池中,可以把任务删除,也可以把任务停止,scheduler把这些任务和触发器放到一个JobStore中,这里jobStore有内存形式的也有持久化形式的,当然也可以自定义扩展成独立的服务。

它内部会通过一个调度线程QuartzSchedulerThread不断到JobStore中找出下次需要执行的任务,并把这些任务封装放到一个线程池ThreadPool中运行,它的组件结构如下图:

各类的调用关系如下图:

下面看看quartz的简单实现:

首先是一个调度管理类:

接下来实现job接口:

测试主函数如下:

运行结果如下:

Quartz运务调度,看完这篇就够了

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:

持久性作业 - 就是保持调度定时的状态;

作业管理 - 对调度作业进行有效的管理;

1.任务job

Job就是你想要实现的任务类。每一个Job必须实现的org.quartz.job接口。且需实现接口的Execute()方法。

2.触发器Trigger

Trigger为你执行任务的触发器,比如你想每天定时8点钟去打卡,Trigger就会设置在8点钟去执行该任务。

Trigger主要有2种触发器器,分别为SimpleTrigger ,CornTrigger两种。

3.调度器Scheduler

Scheduler为任务调度器,它将任务Job和触发器Trigger整合起来。负责基于Trigger设定的时间来执行job。

1.依赖

2.编写job

3.调用。

JobExecutionContext 是一个包含了各种上下文信息的句柄,指向执行中的JobDetail 实例 和 执行完成的Trigger实例

当Schedule调用一个Job时,就会将JobExecutionContext传递给Job的exceute()方法。

Job能够通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的数据明细。我可以通过这个context来访问Trigger,Jobs相关的信息。

1.使用Map获取

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

jobDataMap可以装载任何可序列化的对象。当job实例对象被执行的时候,这些参数会传递给Job

放入参数

取出参数

Job中有一个StatefulJob子接口,代表着有状态的任务, 该接口是一个没有方法的标签接口 ,其目的就是让Quartz知道任务的类型,以便采用不同的执行方案。

无状态任务在执行时,拥有自己的JobDataMap拷贝,每次执行时,都会创建一个新的实例,对JobData的更改不会影响下次的执行。而有状态任务共享同一个JobDataMap实例,每次任务执行对JobDataMap所做的更改都会保存下来,后面的执行可以看到这个更改。也就是每次执行任务后都会对后面的执行发生影响。

正因为这个原因,无状态的Job可以并发执行,而 有状态的StatefulJob不能并发执行。

如果你需要像日历一样,按照日程来触发任务,而不是像SimpleTrigger那样每隔定时间来触发,CornTrigger更加的实用。因为他是基于日历的作业调度器。

使用CronTrigger,你可以指定“每个周五中午”,或者每个工作日的十点钟。或者每周一,像这样的日程安排触发。

1.Cron Expression -Cron表达式

Cron表达式是来配置,CronTrigger实例。Cron表达式是有7个子表达式组成的字符串,每个表达式都描述了一个单独的日程细节。这些表达式用空格来分割。分别表示如下

1.Second 秒

2.Minutes 分钟

3.Hours小时

4 Day of Month 月中的每天

5 Month 月

6 Day of Week 周中某天

7 Year 年

例如下面写一个每个9月19号,每5秒执行一次。

(责任编辑:IT教学网)

更多

推荐其他WEB语言文章