java 多线程——quartz 定时调度的例子
java 多线程 目录:
概述
第1部分 配置
有关quartz的api文档地址:Quartz Enterprise Job Scheduler 1.8.6 API
主要接口目录:
重点看下Job,Scheduler,Trigger,JobDetail几个:
代表任务的类继承Job接口,该接口只有唯一一个方法 execute;当一个任务的触发器启动时,相应的调度器scheduler会调用该任务。
quartz并不保存一个实际的Job类,而是通过允许你定义一个JobDetail取代。
Scheduler代表JobDetails和Triggers的登记表,Scheduler由SchedulerFactory产生。
quartz的配置文件quartzConfig.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.1.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.1.xsd
http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <!-- ====================================================================================== -->
<!-- 拦截器配置文件 -->
<!-- ====================================================================================== -->
<!-- <bean id="startQuartz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> </bean> -->
<!-- ====================================================================================== --> <!-- 要调用的工作类 -->
<bean id="quartzJob" class="com.util.CallQuartz"></bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="quartzJob"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>callAllQuartz</value>
</property>
</bean>
<!-- 定义触发时间 -->
<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jobtask"/>
</property>
<!-- cron表达式 -->
<property name="cronExpression">
<value>*/10 * * * * ?</value>
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="doTime"/>
</list>
</property>
</bean> <!-- ====================================================================================== -->
</beans>
web.xml文件中加入相应上述加载配置文件路径。
第2部分 代码示例
首先定义一个任务的类
package com.util.vo; import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; /**
*
* @ClassName: QuartzVo
*
* @author Xingle
* @date 2014-8-14 下午12:49:25
*/
public class QuartzVo implements Job{ public static int Id = 0; private static Logger logger = Logger.getLogger(QuartzVo.class);
//缓存中任务列表
public static List<QuartzVo> quartzList = new ArrayList<QuartzVo>();
//缓存中任务map
public static Map<String, QuartzVo> quartzMap = new HashMap<String, QuartzVo>(); /**
* id
*/
public String id ;
/**
* 任务名称
*/
public String jobTitle;
/**
* 调度路径
*/
public String jcallpath;
/**
* 触发表达式
*/
public String jobcron;
/**
* @Fields s_date : 开始时间
*/
public String s_date;
/**
* @Fields cycle : 循环标示:1 循环;2 单次
*/
public String cycle; public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getJobTitle() {
return jobTitle;
}
public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}
public String getJcallpath() {
return jcallpath;
}
public void setJcallpath(String jcallpath) {
this.jcallpath = jcallpath;
}
public String getJobcron() {
return jobcron;
}
public void setJobcron(String jobcron) {
this.jobcron = jobcron;
}
public String getCycle() {
return cycle;
}
public void setCycle(String cycle) {
this.cycle = cycle;
} public String getS_date() {
return s_date;
}
public void setS_date(String s_date) {
this.s_date = s_date;
}
/**
* 执行任务
* @Description:
* @param arg0
* @throws JobExecutionException
* @author xingle
* @data 2014-8-14 下午12:51:35
*/
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
String jobName = context.getJobDetail().getName();
logger.debug("定时任务【" + jobName + "】 将要执行 start!!");
QuartzVo quartzVo = QuartzVo.quartzMap.get(jobName);
String inurl = quartzVo.getJcallpath();
URL url = null;
HttpURLConnection conn = null;
try {
url = new URL(inurl);
conn = (HttpURLConnection) url.openConnection();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
System.out.println("***************** 连接失败,程序地址 : " + inurl);
e.printStackTrace();
}
try {
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
System.out.println("****************** 调度失败!!,程序地址 : " + inurl);
} else {
System.out.println("定时任务【" + jobName + "】" + "已完成调度,程序地址: "
+ inurl);
}
} catch (IOException e) {
e.printStackTrace();
} } }
定义一个调用任务:
package com.util; import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import com.util.vo.QuartzVo;
import com.whalin.MemCached.MemCachedClient; /**
* 调用任务
* @ClassName: CallQuartz
* TODO
* @author Xingle
* @date 2014-8-14 下午12:48:44
*/
public class CallQuartz {
private static Logger logger = Logger.getLogger(CallQuartz.class); @Autowired
@Qualifier("memcachedClient")
private MemCachedClient memClient; public void callAllQuartz(){
List<QuartzVo> list =new ArrayList<QuartzVo>();
Iterator<String> idIter = QuartzVo.quartzMap.keySet().iterator();
String idStr = "";
while(idIter.hasNext()){
idStr = idStr+idIter.next()+",";
}
logger.info("当前任务有: "+idStr);
String flag = "";
Map<String,List<QuartzVo> > map = this.getNewJobs();
Iterator<Entry<String, List<QuartzVo>>> iter = map.entrySet().iterator();
while(iter.hasNext()){
Entry<String, List<QuartzVo>> entry = iter.next();
flag = entry.getKey();
list = entry.getValue();
}
//新增
if("1".equals(flag)){
logger.info("新增加定时任务的数量:【 "+list.size()+"】");
for(int i =0;i<list.size();i++){
QuartzVo vo = list.get(i);
QuartzVo.quartzMap.put(vo.getJobTitle(), vo);
QuartzManager.addJob(vo.getJobTitle(), vo, vo.getJobcron()); }
}
else if("2".equals(flag)){
logger.info("删除的定时任务的数量:【 "+list.size()+"】");
for(int i =0;i<list.size();i++){
QuartzVo vo = list.get(i);
QuartzManager.removeJob(vo.getJobTitle());
QuartzVo.quartzMap.remove(vo.getJobTitle());
} } } /**
* 获取任务
* @return
* @author xingle
* @data 2014-8-14 下午12:59:58
*/
private Map<String, List<QuartzVo>> getNewJobs() {
//返回的map
Map<String,List<QuartzVo>> returnMap=new HashMap<String,List<QuartzVo>>();
List<QuartzVo> returnLs = new ArrayList<>();
//文件列表
List<QuartzVo> fileLs = new ArrayList<>();
List<String> fileNameLs = new ArrayList<>();
BufferedReader ins = null;
File f = new File("D:\\test/tasklist1.txt");
try { int i = QuartzVo.Id++;
ins = new BufferedReader(new FileReader(f));
String line = "";
while ((line = ins.readLine()) != null) {
//增加一个是否执行标识,0 未执行
//line = line+"|0";
String[] task = line.split("\\|"); QuartzVo quartzVo = new QuartzVo();
String id = "quarzJob_"+ i;
quartzVo.setId(id);
quartzVo.setJobTitle(task[0]);
quartzVo.setJcallpath(task[1]);
quartzVo.setJobcron(task[2]);
quartzVo.setS_date(task[3]);
quartzVo.setCycle(task[4]); fileLs.add(quartzVo);
fileNameLs.add(quartzVo.getJobTitle());
}
ins.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} String flag = "";
int fileNum = fileLs.size();
int quarzNum = QuartzVo.quartzMap.size();
if(fileNum > quarzNum){
flag = "1";
for(int i =0;i<fileNum;i++){
QuartzVo fileVo = fileLs.get(i);
if(!QuartzVo.quartzMap.keySet().contains(fileVo.getJobTitle())){
QuartzVo.quartzList.add(fileVo);
//要增加的
returnLs.add(fileVo);
}
}
}
else if(fileNum<quarzNum){
flag = "2";
for(int i = 0;i<QuartzVo.quartzList.size() ; i++){
if(!fileNameLs.contains(QuartzVo.quartzList.get(i).getJobTitle())){
//需要要删除的任务
returnLs.add(QuartzVo.quartzList.get(i));
}
}
for(int i = 0;i<QuartzVo.quartzList.size() ; i++){
QuartzVo vo = QuartzVo.quartzList.get(i);
for(int j = 0;j<returnLs.size();j++){
if(vo.getId().equals(returnLs.get(j).getId())){
QuartzVo.quartzList.remove(i);
}
}
}
} returnMap.put(flag, returnLs);
return returnMap;
} }
任务管理:
package com.util; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import org.apache.log4j.Logger;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory; import com.util.vo.QuartzVo; /**
* 任务管理
* @ClassName: QuartzManager
*
* @author Xingle
* @date 2014-8-14 下午2:34:16
*/
public class QuartzManager {
private static Logger logger = Logger.getLogger(QuartzManager.class); //Create an uninitialized StdSchedulerFactory.
private static SchedulerFactory sf = new StdSchedulerFactory(); private static String TRIGGER_GROUP_NAME = "quartzTrigger"; /**
* 添加任务
* @param jobName
* @param job
* @param time
* @author xingle
* @data 2014-8-14 下午7:45:09
*/
public static void addJob(String jobName,QuartzVo job,String time){
try {
Scheduler scheduler = sf.getScheduler(); //任务名,任务组,任务执行类
JobDetail jobDetail = new JobDetail(jobName, jobName, job.getClass()); if("1".equals(job.getCycle())){//循环
CronTrigger trigger = new CronTrigger(jobName, jobName);
trigger.setCronExpression(time);
scheduler.scheduleJob(jobDetail, trigger);
}
else{//单次
String s_Date = job.getS_date();
logger.debug("*****时间:"+s_Date); SimpleDateFormat formate= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startTime = formate.parse(s_Date);
logger.debug("*****时间:"+startTime);
SimpleTrigger trigger = new SimpleTrigger(jobName, jobName, startTime);
scheduler.scheduleJob(jobDetail, trigger);
}
if(!scheduler.isShutdown()){
scheduler.start();
}
logger.debug("*********【添加】定时任务【"+jobName+"】 加载完成!*****************"); } catch (SchedulerException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
} /**
* 删除任务
* @param jobName
* @author xingle
* @data 2014-8-14 下午7:45:16
*/
public static void removeJob(String jobName){
try {
Scheduler sched = sf.getScheduler();
sched.pauseTrigger(jobName,jobName);//停止触发器
sched.unscheduleJob(jobName,jobName);//移除触发器
sched.deleteJob(jobName, jobName);
} catch (SchedulerException e) {
e.printStackTrace();
}
logger.debug("*********定时任务【"+jobName+"】 已删除完成!*****************");
} }
读取的任务简单为下:
任务1|http://www.baidu.com|0 0/1 * * * ?||1
任务4|http://www.iteye.com/problems/99952||2014-08-15 11:34:15|2
任务5|https://pomotodo.com/app/|0 0/1 * * * ?||1
任务3|http://www.w3school.com.cn/html5/|0 0/1 * * * ?||1
任务6|http://tool.oschina.net/apidocs/apidoc?api=jdk-zh|0 0/2 * * * ?||1
java 多线程——quartz 定时调度的例子的更多相关文章
- java 多线程——一个定时调度的例子
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Spring4+Springmvc+quartz实现多线程动态定时调度
scheduler定时调度系统是大多行业项目都需要的,传统的spring-job模式,个人感觉已经out了,因为存在很多的问题,特别是定时调度的追加.修改.删除等,需要修改xml,xml的配置生效无非 ...
- Quartz定时调度框架
Quartz定时调度框架CronTrigger时间配置格式说明 CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年 ...
- java任务调度quartz框架的小例子
quartz是一个开源的作业调度框架,当然,java可以使用Timer来实现简单任务调度的功能,但Timer是单线程的设计方案,使得一个任务延迟会影响到其他的任务.java也可以使用Scheduled ...
- Spring Quartz定时调度任务配置
applicationContext-quartz.xml定时调度任务启动代码: <?xml version="1.0" encoding="UTF-8" ...
- Java多线程-线程的调度(休眠)
Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率. 这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制. ...
- ASP.NET Core使用Quartz定时调度
在应用程序开发过程中,经常会需要定时任务调度功能,本篇博客介绍Asp.net Core如何使用Quartz完成定时调度 一.Quartz使用步骤 创建调度器scheduler,并开启 创建Job作业 ...
- Quartz定时调度在Web中的应用
1.在数据库中建一个job表和job日志表 job表
- Quartz定时调度jar包的执行Demo分享
1.Quartz简介 Quartz框架的核心是调度器.调度器负责管理Quartz应用运行时环境.调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件.Quartz不仅仅是线程和线程管理. ...
随机推荐
- Populating Display Item Value On Query In Oracle Forms
Write Post-Query trigger for the block you want to fetch the field value for display item.ExampleBeg ...
- 基于ADL5317的雪崩光电二极管(APD)偏压控制/光功率监测电路的设计
1 引言 目前,雪崩光电二极管(APD)作为一种高灵敏.能精确接收数据和测量光功率的光探测器件广泛应用于光纤传感.光纤通信网络中.它借助于内部强电场作用产生雪崩倍增效应,具有极高的内部增益(可达102 ...
- Visual C#两分钟搭建BHO IE钩子(转)
摘自:http://www.cnblogs.com/mvc2014/p/3776054.html 微软在1997年正式推出Browser Helper Object (BHO), 使程序员能够更好的对 ...
- FLASH CC 2015 CANVAS (七)总结
FLASH CC 2015 CANVAS (一至七)确切来说是自己在摸索学习过程中而写.所以定为“开荒教程”. 去年年底转战H5,半年中一直非常忙也不敢用CC来做项目,担心有BUG或者无法实现需求,所 ...
- 慎重别选择到"僵尸"软件
何谓僵尸? 没有灵魂,动作单一,我们电视电影上经常看见, 只能往前跳,不会走路, 手向前伸直,左右摆攻击. 何谓"僵尸"软件? 根据僵尸的特性,大概有如下几类: 1.没有任何创新性 ...
- sql概要
sql(structured query language) 1.比较运算符一共有六种,分别为等于(=),小于(<),大于(>),小于或等于(<=),大于或等于(>=)以及不等 ...
- shiro-web整合
1.所需要jar <!-- shiro核心包 --> <dependency> <groupId>org.apache.shiro</groupId> ...
- caffe的db_lmdb.hpp文件
先总的说一下: 类:LMDBCursor: 它干了点什么?它需要传入参数为:mdb_txn(传入它是因为用完它,把它absort掉), mdb_cursor;它应该是用来读出数据的: 类:LMDBT ...
- Linux的中断 & 中断和异常的区别
参考 http://www.yesky.com/20010813/192117.shtml 结构化程序设计思想认为:程序 = 数据结构 + 算法.数据结构体现了整个系统的构架,所以数据结构通常都是代码 ...
- hdu4418(概率dp + 高斯消元)
应该是一个入门级别的题目. 但是有几个坑点. 1. 只选择x能到达的点作为guass中的未知数. 2. m可能大于n,所以在构建方程组时未知数的系数不能直接等于,要+= 3.题意貌似说的有问题,D为- ...