quartz初步认识。
来源:互联网 发布:php 判断是否是移动端 编辑:程序博客网 时间:2024/06/14 08:24
项目需要,动态的配置定时任务。因此,使用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@DisallowConcurrentExecutionpublic 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 的疑问,欢迎加qq群:Quartz任务调度器交流 77383408。
- quartz初步认识。
- Quartz初步接触
- Quartz认识理解
- 认识quartz定时器
- IBM AIX初步认识
- 指针的初步认识!
- 初步认识Struts
- ARCSDE初步认识
- ajax初步认识
- 初步认识 JSON
- 初步认识JFreeChart
- Oracel初步认识
- 初步认识Irr引擎
- Struts初步认识
- openlayers 初步认识
- JavaScript 认识初步..
- 网络爬虫初步认识
- 反射初步认识
- windows 2012 请求列出指定服务器上的可用功能失败
- yii2数据库操作
- 如何升级nodejs
- 虚函数与多态(一)
- 操作系统(二)进程&线程
- quartz初步认识。
- angular中的过滤使用浅析
- 密码检测密码强度
- 网站流量统计工具介绍
- Python灰帽子学习笔记(二)——Immunity Debugger部署硬钩子
- ACM-ICPC 常用算法刷题网站整理
- 编程第二十一天
- java实现SHA1签名加密
- (2)puppet单机测试命令apply