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. python web框架 MVC MTV

    WEB框架 MVC Model View Controller 数据库 模板文件 业务处理 MTV Model Template View 数据库 模板文件 业务处理

  2. Spark Streaming实战

    1.Storm 和 SparkStreaming区别 Storm                      纯实时的流式处理,来一条数据就立即进行处理 SparkStreaming 微批处理,每次处理 ...

  3. PHP 基础篇 - PHP 的 BC MATH 系列数学函数

    一.常见问题 用 PHP 做计算时经常会遇到精度带来的问题,下面来看两个常见的例子: 1. 运算比较 下面表达式输出的结果不是相等: <?php echo 2.01 - 0.01 == 2 ? ...

  4. Centos Docker1.12 远程Rest api访问的配置方法

    Docker默认是没有开启HTTP远程访问的,默认只支持通过unix socket通信操作docker daemon,需要使用HTTP restful接口需要修改配置. 1.修改配置文件,文件位置/l ...

  5. SDUT3141:Count(哈希)好题

    题目:传送门 题目描述 You are given an integer array s[] and are asked to count how many positions a, b, c and ...

  6. django的所有app放在一个文件夹下便于管理

    1.新建一个python Package,名字叫apps 2.拖拽以后的app到apps文件夹下,把Search for references勾选去掉,重要重要重要!!!! 3.右键点击apps文件夹 ...

  7. 20165324《Java程序设计》第七周

    20165324<Java程序设计>第七周 教材学习内容总结 第11章 JDBC与MySOLz数据库 MySQL数据库管理系统,简称MySQL. 使用步骤: 启动MySQL数据库服务 器建 ...

  8. adb push ,adb pull和adb install的区别

    1.用命令行把手机上的文件拷贝到电脑上 1 adb pull sdcard/1222073679.png 拷贝文件夹命令,如把log文件夹拷贝到电脑当前目录 1 adb pull sdcard/log ...

  9. Java linkedList详细介绍及使用示例

    ①LinkedList简单介绍 是一个继承于AbstractSequentialList的双向链表.它可以被当成堆栈.队列或双端队列进行操作. 实现了List接口,能对它进行队列操作. 实现了Dequ ...

  10. shell脚本批量启动zookeeper

    脚本名称为zk_run.sh 将下面代码粘贴进zk_run.sh 添加执行权限 chmode +x zk_run.sh 运行脚本 ./zk_run.sh start 如果发现zookeeper没有启动 ...