package com.heyi.yanglao.common.job.util;

import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*; import java.util.Date; /**
* 定时任务工具类
*
* @author jiang
*/
@Slf4j
public class ScheduleUtils {
private final static String JOB_NAME = "TASK_"; /**
* 获取触发器key
*/
public static TriggerKey getTriggerKey(String jobId) {
return TriggerKey.triggerKey(JOB_NAME + "TRIGGER_KEY" + jobId);
} /**
* 获取jobKey
*/
public static JobKey getJobKey(String jobId) {
return JobKey.jobKey(JOB_NAME + "JOB_KEY" + jobId);
} /**
* 获取表达式触发器
*/
public static CronTrigger getCronTrigger(Scheduler scheduler, String jobId) {
try {
return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
} catch (SchedulerException e) {
e.printStackTrace();
log.info("获取表达式触发器失败");
log.info("productId:" + jobId);
return null;
}
} /**
* 创建定时任务
*
* @param scheduler
* @param activeId 活动id
* @param status 1进行中2未开始3已结束
* @param cron
*/
public static void createScheduleJob(Scheduler scheduler, String activeId, String status, String cron) {
try {
log.info("创建定时任务");
log.info("activeId:" + activeId);
log.info("status:" + status);
//构建job信息
JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(activeId)).build();
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron).withMisfireHandlingInstructionDoNothing();
//按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(activeId)).withSchedule(scheduleBuilder).build(); //放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put("activeId", activeId);
jobDetail.getJobDataMap().put("status", status);
//执行定时器
scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException e) {
e.printStackTrace();
log.info("创建定时任务失败");
log.info("activeId:" + activeId);
}
} /**
* 更新定时任务
*
* @param scheduler
* @param activeId 活动id
* @param status 1进行中2未开始3已结束
* @param cron
*/
public static void updateScheduleJob(Scheduler scheduler, String activeId, String status, String cron) {
try {
log.info("更新定时任务");
log.info("activeId:" + activeId);
log.info("status:" + status);
TriggerKey triggerKey = getTriggerKey(activeId); //表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron).withMisfireHandlingInstructionDoNothing(); CronTrigger trigger = getCronTrigger(scheduler, activeId); //按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); //参数
trigger.getJobDataMap().put("activeId", activeId);
trigger.getJobDataMap().put("status", status); scheduler.rescheduleJob(triggerKey, trigger);
log.info("更新定时任务开始," + DateUtil.formatDate(new Date())); } catch (SchedulerException e) {
e.printStackTrace();
log.info("更新定时任务失败");
log.info("activeId:" + activeId);
}
} /**
* 删除定时任务
*
* @param scheduler
* @param activeId
*/
public static void deleteScheduleJob(Scheduler scheduler, String activeId) {
try {
log.info("删除定时任务");
log.info("activeId:" + activeId);
scheduler.deleteJob(getJobKey(activeId));
} catch (SchedulerException e) {
e.printStackTrace();
log.info("删除定时任务失败");
log.info("activeId:" + activeId);
}
} }

解决service注入问题

package com.heyi.yanglao.common.job.config;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component; /**
* 定义自己的job工厂
*
* @author: jiang
* @Date: 2019/01/25 17:03
* @Desc
*/ @Component
public class MyJobFactory extends AdaptableJobFactory { @Autowired
private AutowireCapableBeanFactory capableBeanFactory; @Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
// 进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}

quartz基本配置:

@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean factory = new SchedulerFactoryBean(); Properties prop = new Properties();
// prop.put("org.quartz.scheduler.instanceName", "ProductSearchScheduler");
// prop.put("org.quartz.scheduler.instanceId", "AUTO");
//线程池配置
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
prop.put("org.quartz.threadPool.threadCount", "30");
prop.put("org.quartz.threadPool.threadPriority", "5");
//JobStore配置
// prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
//集群配置
// prop.put("org.quartz.jobStore.isClustered", "true");
// prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
// prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
//
// prop.put("org.quartz.jobStore.misfireThreshold", "12000");
// prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
// prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); //PostgreSQL数据库,需要打开此注释
// prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"); factory.setQuartzProperties(prop); factory.setSchedulerName("ActiveScheduler");
//延时启动
// factory.setStartupDelay(30);
// factory.setApplicationContextSchedulerContextKey("applicationContextKey");
//可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
// factory.setOverwriteExistingJobs(true);
//设置自动启动,默认为true
factory.setAutoStartup(true);
//service注入问题
factory.setJobFactory(myJobFactory);
return factory;
}

quartz动态job工具类 serviceh注入问题的更多相关文章

  1. Quartz:定时任务工具类

    Quartz:定时任务工具类 Quartz工具类 Quartz工具类 import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; ...

  2. SpringBoot 项目在静态工具类中注入 RedisTemplate

    静态属性不能直接注入,可以通过其set方法进行注入.(注意生成的set方法需要去掉static). 在工具类里直接注入RedisTemplate,两种方法: (1)使用@Autowired priva ...

  3. 工具类静态方法注入dao

    工具类里的一个静态方法需要调用dao查询数据库,用普通的spring注解注入一直报空指针异常,不能找到这个dao.参考的http://busing.iteye.com/blog/899322 的文章解 ...

  4. 工具类中注入service和dao

    今天编写了个工具类需要用到service成和dao层的代码 如下: //第一步:需要将工具类注入到容器中 @Component public class RuleUtils { ​ //第二部注入 @ ...

  5. JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务

    JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...

  6. Android开源项目发现--- 工具类依赖注入DI篇(持续更新)

    通过依赖注入减少View.服务.资源简化初始化,事件绑定等重复繁琐工作 1. AndroidAnnotations(Code Diet) android快速开发框架 项目地址:https://gith ...

  7. Java 实现简单的SQL动态组装工具类

    第一版 package com.zh.oukele.util; import java.util.HashMap; import java.util.Iterator; import java.uti ...

  8. Springboot 工具类静态注入

    用springboot搭了一个项目,里面要用到一个DictUtils,因为要用到DictMapper,在百度找了一些方法,最后用下面的方法能成功获取到DictMapper @Component pub ...

  9. 关于工具类静态方法调用@Autowired注入的service类问题

    @Component //此处注解不能省却(0) 1 public class NtClient { 2 /** 3 * 日志 4 */ 5 private static String clazzNa ...

随机推荐

  1. SSO详解(转)

    转自:http://www.cnblogs.com/EzrealLiu/p/5559255.html 1. 摘要 SSO这一概念由来已久,网络上对应不同场景的成熟SSO解决方案比比皆是,从简单到复杂, ...

  2. redis实现cache系统实践(六)

    1. 介绍 rails中就自带有cache功能,不过它默认是用文件来存储数据的.我们要改为使用redis来存储.而且我们也需要把sessions也存放到redis中.关于rails实现cache功能的 ...

  3. Selenium IDE界面学习

  4. centos上安装redmine

    1.下载bitnami的redmine安装包 https://bitnami.com/stack/redmine/installer 2.安装remine ./bitnami-redmine-3.3. ...

  5. jvm3---垃圾回收器算法

    .1. GC算法 .1.1. 标记-清除算法(Mark-Sweep) 1.标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象 2.在标记完成后统一回收所有被标记的对象 缺点:一个是效率问题 ...

  6. spring中bean实例化时机以及整个运转方式

    接上一篇文章,一般在servlet获取到请求之后 在service方法中就可以完成所有的请求处理以及返回,但是我们会采用更高级的MVC框架来做.也就是说所有的MVC框架入口就是serlvet中的ser ...

  7. Http:设置 浏览器中MIME 类型

    http://www.163ns.com/zixun/post/4602.html 自定义MIME类型支持FLV的相关设置 网络空间支持FLV的相关设置其实很简单,就是自定义一个MIME类型 一般虚拟 ...

  8. MySQL多版本并发控制机制(MVCC)-源码浅析

    MySQL多版本并发控制机制(MVCC)-源码浅析 前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾.<<事务处理-概念与技术>>诚然 ...

  9. 编码解码--url编码解码

    url编码解码,又叫百分号编码,是统一资源定位(URL)编码方式.URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通 ...

  10. Statement与PreparedStatement

    Statement 用于通用查询,能批处理 PreparedStatement(简称PS) 用于执行参数化查询,能批处理 什么是参数化查询? 指在设计与数据库链接并访问数据时,在需要填入数值或数据的地 ...