java quartz spi_java学习心得——Quartz 自定义定时器的操作

packagecom.imaster.admin.web.schemajob;importcom.imaster.admin.model.vo.TaskVo;importcom.imaster.admin.shared.service.version2.ExhibitorReserveExhibitionService;importcom.imaster.constant.ApplicationConfig;importcom.imaster.shared.enums.TaskTypeEnum;importcom.imaster.shared.model.ExhibitorReserveExhibition;importorg.quartz.JobDataMap;importorg.quartz.JobDetail;importorg.quartz.Scheduler;importorg.quartz.SchedulerException;importorg.slf4j.Logger;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.BeanFactory;importorg.springframework.beans.factory.BeanFactoryAware;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.scheduling.quartz.CronTriggerBean;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;/*** @Author wanghh

* 2020/5/9 11:45*/

public class QuartzManager implementsBeanFactoryAware {private static final Logger logger =org.slf4j.LoggerFactory.getLogger(ApplicationConfig.SERVER_NAME);privateScheduler scheduler;private staticBeanFactory beanFactory;

@Autowired

ExhibitorReserveExhibitionService reserveExhibitionService;/*** 定时要执行的方法类。*/

public voidreScheduleJob() {//1.读取数据库中的任务列表。//获取短信定时任务

List list = reserveExhibitionService.selectList(null);for(ExhibitorReserveExhibition item : list

) {

TaskVo taskVo= newTaskVo();

taskVo.setTaskId(item.getId());

taskVo.setTaskType(TaskTypeEnum.EXHIBITOR_RESERVE.getCode());

taskVo.setCronExpression(String.format("0 %s %s * * ? ",item.getAcceptEmailMinute(),item.getAcceptEmailHour()));if (item.getDeleted() == 1 || item.getEnabled() == 0||item.getAcceptEmailRuleTime()==0) {//去掉过时的任务

removeExpireTasks(taskVo);

}else{

configSchedul(taskVo);

}

}

}/*** 移除过期任务

*

*@parambo*/

private voidremoveExpireTasks(TaskVo bo) {try{

CronTriggerBean trigger= (CronTriggerBean) scheduler.getTrigger(bo.getTaskId() + "name" +bo.getTaskType(), Scheduler.DEFAULT_GROUP);if (trigger != null) {

logger.info("==移除任务==" + bo.getTaskId() + "name" +bo.getTaskType());

scheduler.pauseTrigger(trigger.getName(), trigger.getGroup());//停止触发器

scheduler.unscheduleJob(trigger.getName(), trigger.getGroup());//移除触发器

scheduler.deleteJob(trigger.getJobName(), trigger.getJobGroup());//删除任务

}

}catch(SchedulerException e) {

logger.error("移除任务失败...");

e.printStackTrace();

}

}/*** 配置任务列表

*

*@parambo*/

private voidconfigSchedul(TaskVo bo) {try{

CronTriggerBean trigger= (CronTriggerBean) scheduler.getTrigger(bo.getTaskId() + "name" +bo.getTaskType(), Scheduler.DEFAULT_GROUP);if (trigger == null) {//说明schedule中不存在该定时任务

createTriggerTask(bo);

}else{

updateTriggerTask(bo, trigger);

}

}catch(SchedulerException e) {

logger.error("获取触发器trigger失败...");

e.printStackTrace();

}

}/*** 更新任务列表

*

*@parambo*/

private voidupdateTriggerTask(TaskVo bo, CronTriggerBean trigger) {try{//判断从DB中取得的任务时间和现在的quartz线程中的任务时间是否相等//如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob

if (trigger.getCronExpression() != null &&

!trigger.getCronExpression().equalsIgnoreCase(bo.getCronExpression())) {

logger.info("=真正更新方法:=" + bo.getTaskId() + "name" +bo.getTaskType());

trigger.setCronExpression(bo.getCronExpression());

scheduler.rescheduleJob(bo.getTaskId()+ "name" +bo.getTaskType(), Scheduler.DEFAULT_GROUP, trigger);

logger.info("更新任务时间失败...");

}

}catch(Exception e) {

logger.error("更新任务时间失败...");

e.printStackTrace();

}

}/*** 创建任务列表

*

*@parambo*/

private voidcreateTriggerTask(TaskVo bo) {

logger.info("=创建:=" + bo.getTaskId() + "name" +bo.getTaskType());try{

Class clazz= QuartzJobFactory.class;//执行计划任务的类

JobDetail jobDetail = new JobDetail(bo.getTaskId() + "", clazz);

Map map= newHashMap();

map.put("task", bo);

jobDetail.setJobDataMap(newJobDataMap(map));

jobDetail.setName(bo.getTaskId()+ "name" +bo.getTaskType());

scheduler.addJob(jobDetail,true); //将Job添加到管理类//新一个基于Spring的时间类

CronTriggerBean c = newCronTriggerBean();

c.setCronExpression(bo.getCronExpression());//设置时间表达式

c.setName(bo.getTaskId() + "name" + bo.getTaskType());//设置名称

c.setJobDetail(jobDetail);//注入Job

c.setJobName(bo.getTaskId() + "name" + bo.getTaskType());//设置Job名称

scheduler.scheduleJob(c);//注入到管理类

scheduler.rescheduleJob(bo.getTaskId() + "name" + bo.getTaskType(), Scheduler.DEFAULT_GROUP, c);//刷新管理类

} catch(Exception e) {

logger.error("创建" + bo.getTaskId() + "name" + bo.getTaskType() + "任务失败...");

e.printStackTrace();

}

}

@Overridepublic void setBeanFactory(BeanFactory beanFactory) throwsBeansException {

QuartzManager.beanFactory=beanFactory;

}publicScheduler getScheduler() {returnscheduler;

}publicQuartzManager setScheduler(Scheduler scheduler) {this.scheduler =scheduler;return this;

}public staticBeanFactory getBeanFactory() {returnbeanFactory;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz是一个开源的作业调度框架,可以用来调度Java应用程序中的任务。在Quartz中,任务是由一个Trigger和一个Job组成的。Trigger定义了任务何时执行,Job则定义了任务具体要做什么。在Quartz中,我们可以通过编写代码来创建Trigger和Job,并将它们注册到Scheduler中,Scheduler会按照Trigger定义的时间执行Job。 在Quartz中,时间的定义是通过Cron表达式来进行的。Cron表达式是一个字符串,包含6或7个字段,每个字段表示一个时间单位。下面是一个标准的Cron表达式的格式: ``` 秒 分 时 日 月 周 年(可选) ``` 其中,每个字段的含义如下: - 秒:0-59 - 分:0-59 - 时:0-23 - 日:1-31 - 月:1-12 - 周:0-6(0表示周日,1表示周一,以此类推) - 年:可选,表示指定的年份(例如2021) 下面是一个例子: ``` 0 0/5 8-18 * * ? // 每天8点到18点之间,每隔5分钟执行一次 ``` 这个表达式的意思是,在每天的8点到18点之间,每隔5分钟执行一次。 在Quartz中,我们可以通过Cron表达式来定义Trigger的执行时间。下面是一个例子: ```java // 创建一个Trigger,并设置执行时间为每天的8点到18点之间,每隔5分钟执行一次 Trigger trigger = TriggerBuilder.newTrigger() .withSchedule(CronScheduleBuilder.cronSchedule("0 0/5 8-18 * * ?")) .build(); ``` 这个例子中,我们通过CronScheduleBuilder来创建一个Cron表达式,并将其设置到Trigger中。然后,我们可以将这个Trigger注册到Scheduler中,Scheduler会按照Trigger定义的时间执行Job。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值