JAVA动态任务SCHEDULEJOB
一、ScheduleJob实体类介绍
public class ScheduleJob implements Serializable
{
public static String STATUS_RUNNING = "1";
public static final String STATUS_NOT_RUNNING = "0";
public static final String CONCURRENT_IS = "1";
public static final String CONCURRENT_NOT = "0";
/**
* 自己定义的组名与类名
*/
public static final String EXAM_NAME = "EXAM_NAME";
public static final String EXAM_GROUP = "EXAM_GROUP";
private Long jobId;
private Date createTime;
private Date endTime;
private Date updateTime;
/**
* 任务名称 必须
*/
private String jobName;
/**
* 任务分组 必须
*/
private String jobGroup;
/**
* 任务状态 是否启动任务
*/
private String jobStatus;
/**
* cron表达式 必须
*/
private String cronExpression;
/**
* 描述
*/
private String description;
/**
* 任务执行时调用哪个类的方法 包名+类名
*/
private String beanClass;
/**
* 任务是否有状态
*/
private String isConcurrent;
/**
* spring bean 指定springId方式可不指定beanClass
*/
private String springId;
/**
* 任务调用的方法名
*/
private String methodName;
}
二、简单的demo
//在线考试动态任务实例
ScheduleJob scheduleJob = new ScheduleJob();
scheduleJob.setJobId(1L);
scheduleJob.setJobName(QuartzManager.getExamName());
scheduleJob.setJobGroup(QuartzManager.getExamGroup());
scheduleJob.setJobStatus(ScheduleJob.STATUS_RUNNING);
//设定定时器调用的方法路径,一般调用Service中的方法 此实例调用answerResultService中的updateTimer方法
scheduleJob.setSpringId("answerResultService");
scheduleJob.setMethodName("updateTimer");
scheduleJob.setIsConcurrent(ScheduleJob.CONCURRENT_IS);
scheduleJob.setCreateTime(new Date());
int limittime = examina.getLimittime();
Date endTime = DateUtils.getAboutSecond(scheduleJob.getCreateTime(),limittime);
scheduleJob.setEndTime(endTime);
/**
* 参数设置非必须,视定时器调用的函数是否需要传参而定,Object数组传参适用于各种类型的参数
*/
HashMap map = new HashMap();
Class[] cArg = new Class[]{String.class};
Object[] objects = new Object[]{answerResult.getId()};
map.put("clazz", cArg);
map.put("values", objects);
quartzManager.addTriggerJob(scheduleJob,map);
三、动态管理定时器
/**
* 添加一个定时器
* @param job
* @param map
* @throws SchedulerException
*/
public void addTriggerJob(ScheduleJob job,Map map) throws SchedulerException
{
if (job == null || !ScheduleJob.STATUS_RUNNING.equals(job.getJobStatus()))
{
return;
}
Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(),job.getJobGroup());
//此定时器于创建日期立即执行,在规定时间结束,期间1s执行一次
SimpleTrigger simpleTrigger =
(SimpleTrigger) TriggerBuilder.newTrigger().
withIdentity(job.getJobName(),job.getJobGroup()).
startAt(job.getCreateTime()).endAt(job.getEndTime()).
withSchedule(SimpleScheduleBuilder.simpleSchedule().
withIntervalInSeconds(1).repeatForever()).build();
//此定时器在规定时间执行,切执行一次
//SimpleTrigger simpleTrigger =
(SimpleTrigger) TriggerBuilder.newTrigger().
withIdentity(job.getJobName(), job.getJobGroup()).
startAt(startTime).build();
//此定时器在规定时间执行,期间以规定的时间间隔执行一次或数次,无结束日期,在定时任务删除时结束
//SimpleTrigger simpleTrigger =
(SimpleTrigger)TriggerBuilder.newTrigger().
withIdentity(job.getJobName(),job.getJobGroup()).
startAt(startTime).
withSchedule(SimpleScheduleBuilder.simpleSchedule() .
withIntervalInHours(space).repeatForever()).build();
Class clazz = ScheduleJob.CONCURRENT_IS.equals(job.getIsConcurrent())
? QuartzJobFactory.class: QuartzJobFactoryDisallowConcurrentExecution.class;
JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(job.getJobName(),
job.getJobGroup()).build();
jobDetail.getJobDataMap().put("scheduleJob", job);
jobDetail.getJobDataMap().put("map", map);
Date date = scheduler.scheduleJob(jobDetail,simpleTrigger );
System.out.println(jobDetail.getKey() + " will run at: " + date + " and repeat: "+ simpleTrigger.getRepeatCount()
+ " times, every " + simpleTrigger.getRepeatInterval() / 1000L + " seconds");
}
/**
* 获取所有计划中的任务列表
*
* @return
* @throws SchedulerException
*/
public List<ScheduleJob> getAllJob() throws SchedulerException
{
Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
for (JobKey jobKey : jobKeys)
{
List<? extends Trigger> triggers = scheduler
.getTriggersOfJob(jobKey);
for (Trigger trigger : triggers)
{
ScheduleJob job = new ScheduleJob();
job.setJobName(jobKey.getName());
job.setJobGroup(jobKey.getGroup());
job.setDescription("触发器:" + trigger.getKey());
Trigger.TriggerState triggerState = scheduler
.getTriggerState(trigger.getKey());
job.setJobStatus(triggerState.name());
if (trigger instanceof CronTrigger)
{
CronTrigger cronTrigger = (CronTrigger) trigger;
String cronExpression = cronTrigger.getCronExpression();
job.setCronExpression(cronExpression);
}
jobList.add(job);
}
}
return jobList;
}
/**
* 所有正在运行的job
*
* @return
* @throws SchedulerException
*/
public List<ScheduleJob> getRunningJob() throws SchedulerException
{
Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
List<JobExecutionContext> executingJobs = scheduler
.getCurrentlyExecutingJobs();
List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(
executingJobs.size());
for (JobExecutionContext executingJob : executingJobs)
{
ScheduleJob job = new ScheduleJob();
JobDetail jobDetail = executingJob.getJobDetail();
JobKey jobKey = jobDetail.getKey();
Trigger trigger = executingJob.getTrigger();
job.setJobName(jobKey.getName());
job.setJobGroup(jobKey.getGroup());
job.setDescription("触发器:" + trigger.getKey());
Trigger.TriggerState triggerState = scheduler
.getTriggerState(trigger.getKey());
job.setJobStatus(triggerState.name());
if (trigger instanceof CronTrigger)
{
CronTrigger cronTrigger = (CronTrigger) trigger;
String cronExpression = cronTrigger.getCronExpression();
job.setCronExpression(cronExpression);
}
jobList.add(job);
}
return jobList;
}
/**
* 暂停一个job
*
* @param scheduleJob
* @throws SchedulerException
*/
public void pauseJob(ScheduleJob scheduleJob) throws SchedulerException
{
Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());
scheduler.pauseJob(jobKey);
}
/**
* 恢复一个job
*
* @param scheduleJob
* @throws SchedulerException
*/
public void resumeJob(ScheduleJob scheduleJob) throws SchedulerException
{
Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());
scheduler.resumeJob(jobKey);
}
/**
* 删除一个job
*
* @param scheduleJob
* @throws SchedulerException
*/
public void deleteJob(String jobName, String jobGroup) throws SchedulerException
{
Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
JobKey jobKey = JobKey.jobKey(jobName,
jobGroup);
scheduler.deleteJob(jobKey);
}
/**
* 立即执行job
*
* @param scheduleJob
* @throws SchedulerException
*/
public void runAJobNow(ScheduleJob scheduleJob) throws SchedulerException
{
Scheduler scheduler = SpringUtils.getBean(SchedulerFactoryBean.class).getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),
scheduleJob.getJobGroup());
scheduler.triggerJob(jobKey);
}
四、定时器执行流程
/**
* 计划任务执行处 无状态 并发执行
* @author zdw
* 有状态,添加@DisallowConcurrentExecution注解进行取消并发
*/
public class QuartzJobFactory implements Job
{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException
{
ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
TaskUtils.invokMethod(scheduleJob,context);
}
}
/**
* 通过反射调用scheduleJob中定义的方法
*
* @param scheduleJob
*/
public static void invokMethod(ScheduleJob scheduleJob,JobExecutionContext context) {
Object object = null;
Class clazz = null;
//springId不为空先按springId查找bean
if (StringUtils.isNotEmpty(scheduleJob.getSpringId())) {
object = SpringUtils.getBean(scheduleJob.getSpringId());
} else if (StringUtils.isNotEmpty(scheduleJob.getBeanClass())) {
try {
clazz = Class.forName(scheduleJob.getBeanClass());
object = clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
if (object == null) {
log.error("任务名称 = [" + scheduleJob.getJobName() + "]---------------未启动成功,请检查是否配置正确!!!");
return;
}
clazz = object.getClass();
Method method = null;
JobDataMap jdm = context.getMergedJobDataMap();
HashMap map = (HashMap) jdm.get("map");
if(map != null || map.size() != 0){
Class[] cArg = (Class[]) map.get("clazz");
Object[] values = (Object[]) map.get("values");
try {
method = clazz.getDeclaredMethod(scheduleJob.getMethodName(),cArg);
} catch (NoSuchMethodException e) {
log.error("任务名称 = [" + scheduleJob.getJobName() + "]---------------未启动成功,方法名设置错误!!!");
} catch (SecurityException e) {
e.printStackTrace();
}
if (method != null) {
try {
method.invoke(object,values);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} else{
try {
method = clazz.getDeclaredMethod(scheduleJob.getMethodName());
} catch (NoSuchMethodException e) {
log.error("任务名称 = [" + scheduleJob.getJobName() + "]---------------未启动成功,方法名设置错误!!!");
} catch (SecurityException e) {
e.printStackTrace();
}
if (method != null) {
try {
method.invoke(object);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
五、配置相关
pom.xml
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.2</version>
</dependency>
applicationContext-quartz-cron-local.xml
<description>Quartz的本地Cron式执行任务配置</description>
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<!-- Job接受applicationContext的成员变量名 -->
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
</bean>
applicationContext-quartz-timer-cluster.xml
<description>Quartz的定时集群任务配置</description>
<!-- Quartz集群Schduler -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<!-- Triggers集成 -->
<property name="triggers">
<list>
</list>
</property>
<!-- quartz配置文件路径, 指向cluster配置 -->
<property name="configLocation" value="classpath:schedule/quartz-cluster.properties" />
<!-- 启动时延期2秒开始任务 -->
<property name="startupDelay" value="30" />
<!-- 保存Job数据到数据库所需的数据源 -->
<property name="dataSource" ref="quartzDataSource" />
<!-- Job接受applicationContext的成员变量名 -->
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
</bean>
<!-- Job的可配置属性,在job中通过applicationContext动态获取 -->
<util:map id="timerJobConfig">
<entry key="nodeName" value="${server.node_name}" />
</util:map>
JAVA动态任务SCHEDULEJOB相关推荐
- java动态代理【一】
java动态代理的定义:为其他目标类的方法增加切面的逻辑,即在执行目标类方法的时候,先去执行一段如校验检测的逻辑代码.java通俗一点就是生成一个继承目标类的子类,并在每个调用方法都添加一段逻辑. 应 ...
- AspectJ和Spring AOP(java动态代理和CGLIB)简单介绍
1.AOP介绍 什么是AOP:AOP就是面向切面编程.使用的背景: 1)我们的振隆维护着一千个方法,一天老板让振隆把这一千个方法都要加上事务代码(统一代码) 2)振隆咬咬牙,添加了一个新的方法,然后让 ...
- Java 动态语言
Java 动态语言 XRuby 官方网站: http://code.google.com/p/xruby/ 2009-05-24 JBasic 官方网站: http://jbasic.sourcef ...
- Java动态代理的实现
动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. ...
- Java动态代理与Cglib代理
为什么80%的码农都做不了架构师?>>> 最近又继续回来死磕Spring源码,以前看的也忘得差不多了,这次先把Spring使用的动态代理cglib看了一下,打好基础知识. cg ...
- JAVA 动态代理学习记录
打算用JAVA实现一个简单的RPC框架,看完RPC参考代码之后,感觉RPC的实现主要用到了两个方面的JAVA知识:网络通信和动态代理.因此,先补补动态代理的知识.---多看看代码中写的注释 参考:Ja ...
- 初看Mybatis 源码 (二) Java动态代理类
先抛出一个问题,用过Mybatis的都知道,我们只需要定义一个Dao的接口,在里面写上一些CRUD相关操作,然后配置一下sql映射文件,就可以达到调用接口中的方法,然后执行sql语句的效果,为什么呢? ...
- Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP
Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP xBird 原创 (参与分:36,专家分:90) 发表:2004-9-3 上午9:37 版本:1.0 阅读:160 ...
- Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c
2019独角兽企业重金招聘Python工程师标准>>> 有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件. 那么技术实 ...
最新文章
- 我们究竟应不应该使用框架?
- 2018-06-02笔记
- JS选中OPTION
- Retrofit2.0和Rxjava结合使用的简单记录
- 如何提取SAP UI5应用的技术信息
- 如何在matlab里输入复杂公式_在MATLAB作图中输出漂亮的公式
- Python正则表达式re.sub使用
- w10电脑c盘满了怎么清理_Win10专业版电脑c盘满了怎么清理?教你一招快速清理C盘...
- LA 6047 Perfect Matching 字符串哈希
- 【个人网站搭建教程】阿里云服务器+宝塔+wordpress
- 网络架构设计:CNN based和Transformer based
- hdu 2037 这个夏天不AC (java)
- 在Mind+下使用Easy loT实现mqtt消息消息的通讯
- Oracle实现网吧计费系统,毕业设计(论文)-网吧计费管理系统设计.doc
- 大一python选择题题库及答案_python选择题库
- 微信营销与微博营销的区别
- 什么是实体关系图(ERD)?
- lingo纳什均衡代码_传统的战略式博弈求解纳什均衡方法——虚拟博弈(Fictitious Play)讲解及其代码...
- java框架-Springmvc-quzrtz-jasperreport-pio-pdfbox-jedis
- P1930 亚瑟王的宫殿