700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > java se 定时任务_Quartz 定时任务使用 —— 入门简单调用(一)

java se 定时任务_Quartz 定时任务使用 —— 入门简单调用(一)

时间:2021-06-29 22:01:45

相关推荐

java se 定时任务_Quartz 定时任务使用 —— 入门简单调用(一)

Quartz详细介绍

Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构 建,JavaMail及其它,支持cron-like表达式等等。

Quartz框架是一个全功能、开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统。Quartz可以执行上千上万的任务调度。

Quartz 核心概念

Job(任务)、JobDetail(任务细节)、Trigger(触发器)、Scheduler(任务调度器)

Job:其实Job是接口,查看源码就知道只有一个execute方法:packageorg.quartz;

publicinterfaceJob{

voidexecute(JobExecutionContextvar1)throwsJobExecutionException;

}

我们开发者只要实现此接口,实现execute方法即可。把我们想做的事情,在execute中执行即可。

JobDetail:Quartz执行Job时,需要新建个Job实例,但是不能直接操作Job类,所以通过JobDetail来获取Job的名称、描述信息。重要属性如下:name:任务的名称。

group:任务所在的组(默认值:DEFAULT)。

jobClass:任务的实现类。

jobDataMap:传参的作用。

Trigger:执行任务的规则;比如每天,每小时等。

一般情况使用SimpleTrigger 和 CronTrigger,这个触发器实现了 Trigger 接口。CronTrigger:对于复杂的时间表达式使用,比如每个月15日上午几点几分

SimpleTrigger:对于简单的时间表达式使用,比如每天执行几次

Scheduler:是最核心的概念,需要把JobDetail和Trigger注册到scheduler中,才可以执行。

下载jar包,本文内容使用的是最新的2.3版本

org.quartz-scheduler

quartz

2.2.1

org.quartz-scheduler

quartz-jobs

2.2.1

简单的示例publicclassQuartzTest{

publicstaticvoidmain(String[]args){

try{

//获取Scheduler调度器实例

Schedulerscheduler=StdSchedulerFactory.getDefaultScheduler();

//启动调度

scheduler.start();

//关闭调度

scheduler.shutdown();

}catch(SchedulerExceptionse){

se.printStackTrace();

}

}

}

一旦您使用StdSchedulerFactory.getDefaultScheduler()获取调度程序,您的应用程序将不会终止,直到您调用scheduler.shutdown(),因为将有活动线程。

注意

不同的版本的jar包,具体的操作不太相同,但是思路是相同的;比如1.8.6jar包中,JobDetail是个类,直接通过构造方法与Job类关联。SimpleTrigger和CornTrigger是类;在2.0.2jar包中,JobDetail是个接口,SimpleTrigger和CornTrigger是接口

JavaSE 简单的搭建

项目结构图

log4j.xml,日志输出<?xml version="1.0"encoding="UTF-8"?>

log4j:configurationSYSTEM"log4j.dtd">

HelloJob.java,具体执行的任务importorg.quartz.Job;

importorg.quartz.JobExecutionContext;

importorg.quartz.JobExecutionException;

importorg.slf4j.Logger;

importorg.slf4j.LoggerFactory;

/**

*具体执行的任务

*/

publicclassHelloJobimplementsJob{

Loggerlogger=LoggerFactory.getLogger(this.getClass());

@Override

publicvoidexecute(JobExecutionContextjobExecutionContext)throwsJobExecutionException{

System.out.println("HelloJob");

//此任务仅打印日志便于调试、观察

this.logger.debug(this.getClass().getName()+"trigger...");

}

}

Main方法测试importorg.quartz.*;

importorg.quartz.impl.StdSchedulerFactory;

importorg.slf4j.Logger;

importorg.slf4j.LoggerFactory;

importjava.util.concurrent.TimeUnit;

/**

*测试入口

*/

publicclassBootstrap{

privatestaticLoggerlogger=LoggerFactory.getLogger(Bootstrap.class);

publicstaticvoidmain(String[]args){

try{

//获取Scheduler调度器实例

Schedulerscheduler=StdSchedulerFactory.getDefaultScheduler();

//启动调度

scheduler.start();

//具体任务JobDetail

JobDetailjob=JobBuilder.newJob(HelloJob.class).withIdentity("job1","group1").build();

//触发时间点(每5秒执行一次)

SimpleScheduleBuildersimpleScheduleBuilder=SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();

//触发器

Triggertrigger=TriggerBuilder.newTrigger().withIdentity("trigger1","group1").startNow().withSchedule(simpleScheduleBuilder).build();

//交由Scheduler安排触发

scheduler.scheduleJob(job,trigger);

/*为观察程序运行,此设置主程序睡眠1分钟才继续往下运行(因下一个步骤是“关闭Scheduler”)*/

try{

TimeUnit.MINUTES.sleep(1);

}catch(InterruptedExceptione){

e.printStackTrace();

}

//关闭调度

scheduler.shutdown();

}catch(SchedulerExceptionse){

logger.error(se.getMessage(),se);

}

}

}

除了上面的SimpleTrigger,最常见的还有Cron表达式的用法,至于什么含义,在第三章中会有讲到CronTriggertrigger=newTrigger().withIdentity("trigger1","group1").withSchedule(cronSchedule("0/20****?")).build();

Dateft=sched.scheduleJob(job,trigger);

log.info(job.getKey()+"计划运行时间:"+ft+"cron表达式:"+trigger.getCronExpression());

执行调度的结果输出日志INFO]09九月04:32:17.318下午main[org.quartz.impl.StdSchedulerFactory]

UsingdefaultimplementationforThreadExecutor

[INFO]09九月04:32:17.322下午main[org.quartz.simpl.SimpleThreadPool]

Jobexecutionthreadswilluseclassloaderofthread:main

[INFO]09九月04:32:17.336下午main[org.quartz.core.SchedulerSignalerImpl]

InitializedSchedulerSignalleroftype:classorg.quartz.core.SchedulerSignalerImpl

[INFO]09九月04:32:17.336下午main[org.quartz.core.QuartzScheduler]

QuartzSchedulerv.2.2.3created.

[INFO]09九月04:32:17.337下午main[org.quartz.simpl.RAMJobStore]

RAMJobStoreinitialized.

[INFO]09九月04:32:17.338下午main[org.quartz.core.QuartzScheduler]

Schedulermeta-data:QuartzScheduler(v2.2.3)'DefaultQuartzScheduler'withinstanceId'NON_CLUSTERED'

Schedulerclass:'org.quartz.core.QuartzScheduler'-runninglocally.

NOTSTARTED.

Currentlyinstandbymode.

Numberofjobsexecuted:0

Usingthreadpool'org.quartz.simpl.SimpleThreadPool'-with10threads.

Usingjob-store'org.quartz.simpl.RAMJobStore'-whichdoesnotsupportpersistence.andisnotclustered.

[INFO]09九月04:32:17.338下午main[org.quartz.impl.StdSchedulerFactory]

Quartzscheduler'DefaultQuartzScheduler'initializedfromdefaultresourcefileinQuartzpackage:'quartz.properties'

[INFO]09九月04:32:17.338下午main[org.quartz.impl.StdSchedulerFactory]

Quartzschedulerversion:2.2.3

[INFO]09九月04:32:17.338下午main[org.quartz.core.QuartzScheduler]

SchedulerDefaultQuartzScheduler_$_NON_CLUSTEREDstarted.

HelloJob

[DEBUG]09九月04:32:17.350下午DefaultQuartzScheduler_Worker-1[com.anson.example1.HelloJob]

com.anson.example1.HelloJobtrigger...

HelloJob

[DEBUG]09九月04:32:22.344下午DefaultQuartzScheduler_Worker-2[com.anson.example1.HelloJob]

com.anson.example1.HelloJobtrigger...

HelloJob

[DEBUG]09九月04:32:27.344下午DefaultQuartzScheduler_Worker-3[com.anson.example1.HelloJob]

com.anson.example1.HelloJobtrigger...

...

...省略一下重复调度的helloJob内容日志...

...

[INFO]09九月05:00:38.327下午main[org.quartz.core.QuartzScheduler]

SchedulerDefaultQuartzScheduler_$_NON_CLUSTEREDshuttingdown.

[INFO]09九月05:00:38.327下午main[org.quartz.core.QuartzScheduler]

SchedulerDefaultQuartzScheduler_$_NON_CLUSTEREDpaused.

[INFO]09九月05:00:38.328下午main[org.quartz.core.QuartzScheduler]

SchedulerDefaultQuartzScheduler_$_NON_CLUSTEREDshutdowncomplete.

HelloJob

[DEBUG]09九月05:00:38.328下午DefaultQuartzScheduler_Worker-3[com.anson.example1.HelloJob]

com.anson.example1.HelloJobtrigger...

通过观察上面的日志可以看出一些默认的配置信息,比如何时开启调度,何时关闭调度,调度器的默认实例名DefaultQuartzScheduler ,默认的SimpleThreadPool执行的线程数位10个等等。

打开 quartz-2.2.3.jar 文件中的默认 quartz.properties 文件,对应的默认配置信息如下。#DefaultPropertiesfileforusebyStdSchedulerFactory

#tocreateaQuartzSchedulerInstance,ifadifferent

#propertiesfileisnotexplicitlyspecified.

#

org.quartz.scheduler.instanceName:DefaultQuartzScheduler

org.quartz.scheduler.rmi.export:false

org.quartz.scheduler.rmi.proxy:false

org.quartz.scheduler.wrapJobExecutionInUserTransaction:false

org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool

org.quartz.threadPool.threadCount:10

org.quartz.threadPool.threadPriority:5

org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread:true

org.quartz.jobStore.misfireThreshold:60000

org.quartz.jobStore.class:org.quartz.simpl.RAMJobStore

如果在测试或生产环境中进行动态配置上吗的默认信息,可以在src目录下新建一个quartz.properties 文件,配置内容来覆盖默认配置。org.quartz.scheduler.instanceName=MyScheduler

org.quartz.threadPool.threadCount=3

然后,在运行demo示例,会发现日志中的输出就会有所变化。

调度器的实例名变成了MyScheduler,线程的数量变成了3个,这意味着,同时最多可以运行3个Jobs[INFO]09九月04:56:54.685下午main[org.quartz.impl.StdSchedulerFactory]

UsingdefaultimplementationforThreadExecutor

[INFO]09九月04:56:54.704下午main[org.quartz.core.SchedulerSignalerImpl]

InitializedSchedulerSignalleroftype:classorg.quartz.core.SchedulerSignalerImpl

[INFO]09九月04:56:54.704下午main[org.quartz.core.QuartzScheduler]

QuartzSchedulerv.2.2.3created.

[INFO]09九月04:56:54.705下午main[org.quartz.simpl.RAMJobStore]

RAMJobStoreinitialized.

[INFO]09九月04:56:54.706下午main[org.quartz.core.QuartzScheduler]

Schedulermeta-data:QuartzScheduler(v2.2.3)'MyScheduler'withinstanceId'NON_CLUSTERED'

Schedulerclass:'org.quartz.core.QuartzScheduler'-runninglocally.

NOTSTARTED.

Currentlyinstandbymode.

Numberofjobsexecuted:0

Usingthreadpool'org.quartz.simpl.SimpleThreadPool'-with3threads.

Usingjob-store'org.quartz.simpl.RAMJobStore'-whichdoesnotsupportpersistence.andisnotclustered.

[INFO]09九月04:56:54.706下午main[org.quartz.impl.StdSchedulerFactory]

Quartzscheduler'MyScheduler'initializedfromdefaultresourcefileinQuartzpackage:'quartz.properties'

[INFO]09九月04:56:54.706下午main[org.quartz.impl.StdSchedulerFactory]

Quartzschedulerversion:2.2.3

[INFO]09九月04:56:54.707下午main[org.quartz.core.QuartzScheduler]

SchedulerMyScheduler_$_NON_CLUSTEREDstarted.

HelloJob

[DEBUG]09九月04:56:54.721下午MyScheduler_Worker-1[com.anson.example1.HelloJob]

com.anson.example1.HelloJobtrigger...

...

...省略一下重复调度的helloJob内容日志...

...

[DEBUG]09九月04:57:49.717下午MyScheduler_Worker-3[com.anson.example1.HelloJob]

com.anson.example1.HelloJobtrigger...

HelloJob

[DEBUG]09九月04:57:54.719下午MyScheduler_Worker-1[com.anson.example1.HelloJob]

com.anson.example1.HelloJobtrigger...

[INFO]09九月04:57:54.721下午main[org.quartz.core.QuartzScheduler]

SchedulerMyScheduler_$_NON_CLUSTEREDshuttingdown.

[INFO]09九月04:57:54.721下午main[org.quartz.core.QuartzScheduler]

SchedulerMyScheduler_$_NON_CLUSTEREDpaused.

[INFO]09九月04:57:54.721下午main[org.quartz.core.QuartzScheduler]

SchedulerMyScheduler_$_NON_CLUSTEREDshutdowncomplete.

如果你的英文够好的话,非常建议有必要阅读官方文档提供的示例代码跟着一起操作

http://www.quartz-/documentation/quartz-2.2.x/examples/标题描述"Hello World" for Quartz 入门

Example 2 - Simple Triggers显示了十几种使用简单触发器调度作业的不同方式

显示如何使用Cron Triggers来安排您的工作

演示参数如何传递到job以及job如何维持状态

Example 7 - Interrupting Jobs显示调度程序如何中断您的工作以及如何编写您的工作来处理中断

Example 8 - Fun with Calendars演示了一个假期日历如何可以用来排除在假期的作业的执行

Example 9 - Job Listeners使用job监听器让一个job触发另一个job,构建一个简单的工作流程

Example 10 - Using Quartz Plug-Ins演示使用XML作业初始化插件以及历史记录插件

Example 11 - Quartz Under High LoadQuartz可以运行大量的job,但是看看线程池如何可以限制同时执行多少个job

Example 12 - Remote Job Scheduling using RMI使用远程方法调用,Quartz调度程序可以由客户端远程调度

Example 13 - Clustered Quartz演示如何在集群环境中使用Quartz,以及Quartz如何使用数据库来保留计划信息

演示如何使用Trigger优先级来管理具有相同火灾时间的触发器的触发顺序

Example 15 - TC Clustered Quartz演示Quartz如何与Terracotta集群,而不是数据库

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。