项目需要,动态的配置定时任务。因此,使用quartz 来完成定时任务功能。
网上 入门基础,教程,都有很多,我只说一下我的理解和思路。
例子,链接:http://download.csdn.net/detail/u012246342/9853008
1、什么是任务(任务类)
定时任务,肯定,离不开任务。什么是任务?
任务就是 一个实现了 Job 接口,并且 重写了execute 方法 ,或者 继承自QuartzJobBean 并 重写executeInternal(根本上,等于继承自job接口) 的类。
这个类,可以理解为,任务执行类。启动定时任务,就是设置时间,定时启动,这个类 中的execute(executeInternal) 方法。
代码如图下:
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;
import quartz.cn.digitalpublishing.model.ScheduleJob;
import quartz.cn.digitalpublishing.vo.ScheduleJobVo;
/**
* author : fengjing
* createTime : 2016-08-04
* description : 异步任务工厂
* version : 1.0
*/
public class AsyncJobFactory extends QuartzJobBean {
/* 日志对象 */
private static final Logger LOG = LoggerFactory.getLogger(AsyncJobFactory.class);
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
LOG.info("AsyncJobFactory execute");
ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get(ScheduleJobVo.JOB_PARAM_KEY);
System.out.println("jobName:" + scheduleJob.getJobName() + " " + scheduleJob);
}
}
代码中,executeInternal 方法,就是 每次启动定时任务 ,需要执行的方法。这个类,就是一个 任务类。
其他的,就是 从头开始配置了。这里有个 例子,链接:http://download.csdn.net/detail/u012246342/9853008
1、spring.xml 配置。
2、ScheduleJobInit 的 init 方法 设置,项目启动后执行。
3、ScheduleUtils 的createScheduleJob 的方法,在启动后,创建定时任务。
其中,ScheduleJob 类,属于,任务计划模型, 包括一系列 任务执行需要的参数。
2、如何在quartz 中,访问controller ,或者,在定时任务中,访问网络请求。
首先,启动一个 定时任务,就 等于 执行一次execute 方法。所以,在 任务 工厂类 的executeInternal 中,通过 httpclient 访问你所需要执行的 url就可以了。
代码如下:
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;
import quartz.cn.digitalpublishing.model.ScheduleJob;
import quartz.cn.digitalpublishing.vo.ScheduleJobVo;
/**
* author : fengjing
* createTime : 2016-08-04
* description : 同步任务工厂
* version : 1.0
*/
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class SyncJobFactory extends QuartzJobBean {
/* 日志对象 */
private static final Logger LOG = LoggerFactory.getLogger(SyncJobFactory.class);
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
LOG.info("SyncJobFactory execute");
JobDataMap mergedJobDataMap = context.getMergedJobDataMap();
ScheduleJob scheduleJob = (ScheduleJob) mergedJobDataMap.get(ScheduleJobVo.JOB_PARAM_KEY);
System.out.println("jobName:" + scheduleJob.getJobName() + " " + scheduleJob);
String url = scheduleJob.getUrl();
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response;
try {
response = httpclient.execute(httpGet);
System.out.println(response.getStatusLine());
HttpEntity entity = response.getEntity();
EntityUtils.consume(entity);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、给quartz定时任务,传递参数的问题。如图下:
代码如下:
/**
* 创建定时任务
*
* @param scheduler the scheduler
* @param jobName the job name
* @param jobGroup the job group
* @param cronExpression the cron expression
* @param isSync the is sync
* @param param the param
*/
public static void createScheduleJob(Scheduler scheduler, String jobName, String jobGroup, String cronExpression, boolean isSync, Object param)throws Exception {
//同步或异步
Class<? extends Job> jobClass = isSync ? AsyncJobFactory.class : SyncJobFactory.class;
//构建job信息
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
//按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup).withSchedule(scheduleBuilder).build();
String jobTrigger = trigger.getKey().getName();
ScheduleJob scheduleJob = (ScheduleJob)param;
scheduleJob.setJobTrigger(jobTrigger);
//放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put(ScheduleJobVo.JOB_PARAM_KEY, scheduleJob);
try {
Boolean is = scheduler.isStarted();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
LOG.error("创建定时任务失败", e);
e.printStackTrace();
throw new Exception("创建定时任务失败");
}
}
所以,现在可以看懂, 代码片段1 ,和 代码片段 2 中的
ScheduleJob scheduleJob = (ScheduleJob) mergedJobDataMap.get(ScheduleJobVo.JOB_PARAM_KEY);
是从哪来的了吧。
如果还有 任何关于 quartz 的疑问,欢迎加:Quartz任务调度器交流77383408。
分享到:
相关推荐
文件里面包括 1:Quartz开发指南.pdf 2:Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它...
quartz quartz-1.8.6 dbTables quartz动态任务调度需要的数据库脚本。
quartz简单实例quartz简单实例quartz简单实例quartz简单实例
赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...
该压缩包内包含两个quartz的jar包, 分别是quartz-1.6.0.jar和quartz-all-1.6.0.jar
quartz-2.2.3版本的quartz初始化sql语句
赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...
lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子
Quartz1.5,Quartz1.6,Quartz1.8。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个...
Quartz使用方法Quartz使用方法Quartz使用方法Quartz使用方法Quartz使用方法
Quartz.NET框架的核心是调度器。调度器负责管理Quartz.NET应用运行时环境。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz.NET采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器...
quartz内部表.sql。
Quartz原理及实例,spring4.x+Quartz.2.2.1结合的开发,静态和动态实例
quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则
在 myeclipse6.0.1下调试成功可直接运行的spring的quartz的例子,很适合刚接触quartz调度学习。
Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。 Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的...
quartz-2.2.1 最新包
Quartz使用指南 Quartz使用指南 Quartz使用指南
Autofac.Extras.Quartz, Quartz.Net的Autofac集成 Autofac.Extras.Quartz用于 Quartz.Net的Autofac集成包。Autofac.Extras.Quartz 为每个石英作业创建嵌套的litefime作用域。 完成作业执行后释放嵌套作用域。这允许...
postgres quatrz初始化sql脚本文件、pg、quartz、qrtz_开头的表 配置文件需求修改 #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore....