一、利弊

  针对001 中设置,不方便程序中动态添加任务,只能使用配置进行配置任务,

    适用于已知固定时刻需要执行的任务。

  针对002中设置,不方便结合调用spring注入的实体

    使用于程序内部新增添的任务

二、结合spring以及动态添加任务

  1.编写ApplicationContext对象注入类

@Component
public class SpringContextUtil implements ApplicationContextAware {
// Spring应用上下文环境
private static ApplicationContext applicationContext; /**
* 实现ApplicationContextAware接口的回调方法。设置上下文环境
*
* @param applicationContext
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextUtil.applicationContext = applicationContext;
} /**
* @return ApplicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
} /**
* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
checkApplicationContext();
if (applicationContext.containsBean(name)) {
return (T) applicationContext.getBean(name);
}
return null;
} /**
* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<T> clazz) {
checkApplicationContext();
return (T) applicationContext.getBean(clazz);
} private static void checkApplicationContext() {
if (applicationContext == null){
throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextUtil");
}
} /**
* 同步方法注册bean到ApplicationContext中
*
* @param beanName
* @param clazz
* @param original bean的属性值
*/
public static synchronized void setBean(String beanName, Class<?> clazz,Map<String,Object> original) {
checkApplicationContext();
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
if(beanFactory.containsBean(beanName)){
return;
}
//BeanDefinition beanDefinition = new RootBeanDefinition(clazz);
GenericBeanDefinition definition = new GenericBeanDefinition();
//类class
definition.setBeanClass(clazz);
//属性赋值
definition.setPropertyValues(new MutablePropertyValues(original));
//注册到spring上下文
beanFactory.registerBeanDefinition(beanName, definition);
} /**
* 删除spring中管理的bean
* @param beanName
*/
public static void removeBean(String beanName){
ApplicationContext ctx = SpringContextUtil.getApplicationContext();
DefaultListableBeanFactory acf = (DefaultListableBeanFactory) ctx.getAutowireCapableBeanFactory();
if(acf.containsBean(beanName)) {
acf.removeBeanDefinition(beanName);
}
} /**
* 根据bean的id来查找对象
*
* @param id
* @return
*/ public static <T> T getBeanById(String id) {
return (T) applicationContext.getBean(id);
}
}

  2.spring,xml配置

<bean id="spring" class="com.trace.common.quartz.SpringContextUtil" />

  3.编写Job接口工厂

public class JobFactory extends AdaptableJobFactory {

    @Autowired
private AutowireCapableBeanFactory capableBeanFactory; @Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
//进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}

  4.注入Job工厂,以及quartz调度工厂

    <bean id="jobFactory" class="com.jd.ofc.trace.common.quartz.JobFactory"></bean>
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory"></property>
</bean>

  5.java帮助类

public class TaskJobUtil {
private static final Logger logger = LoggerFactory.getLogger(TaskJobUtil.class); private TaskJobUtil() {
} /**
* 添加任务
*
* @param job 要调用的job类
* @param jobName job名称
* @param cronExpression 任务触发时间表达式
* @param param 需要用到的参数,可在job类中的context获得
*/
public static void addJob(Job job, String jobName, String cronExpression, Map param) {
Scheduler scheduler = null;
try {
removeJob(jobName, job.getClass().getCanonicalName() + "Group");//删除原任务
scheduler= (StdScheduler)SpringContextUtil.getBean("schedulerFactoryBean");
JobDetail jobDetail = getJobDetail(job, jobName, param);
String jobGroup = jobDetail.getGroup();
CronTrigger cronTrigger = getCronTrigger(job, jobName, jobGroup, cronExpression);
scheduler.scheduleJob(jobDetail, cronTrigger);
logger.info("添加任务:" + jobName);
startScheduler();
} catch (SchedulerException e) {
logger.error("", e);
}
} /**
* 对外停止任务调度器方法
*/
public static void stopJob() {
shutdownScheduler();
} /**
* 启动调度器
*/
protected static void startScheduler() {
Scheduler scheduler = null;
try {
scheduler= (StdScheduler)SpringContextUtil.getBean("schedulerFactoryBean");
//如果调度器未启动,启动调度器
if (scheduler != null && !scheduler.isStarted()) {
scheduler.start();
}
} catch (SchedulerException e) {
logger.error("", e);
}
} /**
* 关闭调度器,关闭后任务也都清除
*/
protected static void shutdownScheduler() {
Scheduler scheduler = null;
try {
scheduler= (StdScheduler)SpringContextUtil.getBean("schedulerFactoryBean");
//如果调度器未关闭,关闭调度器
if (scheduler != null && !scheduler.isShutdown()) {
scheduler.shutdown();
}
} catch (SchedulerException e) {
logger.error("", e);
}
} /**
* 获取JobDetail
*
* @param job
* @param param
* @return
*/
protected static JobDetail getJobDetail(Job job, String jobName, Map param) {
Class jobClazz = job.getClass();
if (jobName == null || "".equals(jobName)) {
jobName = jobClazz.getCanonicalName();
}
String jobGroup = jobClazz.getCanonicalName() + "Group"; JobDetail jobDetail = new JobDetail();
jobDetail.setDurability(true);
jobDetail.setRequestsRecovery(true);
jobDetail.setName(jobName);
jobDetail.setGroup(jobGroup);
jobDetail.setJobClass(jobClazz); if (param != null && param.size() > 0) {
JobDataMap jobDataMap = new JobDataMap(param);//存放参数
jobDetail.setJobDataMap(jobDataMap); logger.info("任务 " + jobName + " jobDetail存放的参数:" + param);
}
return jobDetail;
} /**
* 获取触发器
*
* @param job
* @param jobName
* @param cronExpression
* @return
*/
protected static CronTrigger getCronTrigger(Job job, String jobName, String jobGroup, String cronExpression) {
Class jobClazz = job.getClass();
String triggerName = jobName+jobClazz.getCanonicalName() + "Trigger";
String triggerGroup = jobClazz.getCanonicalName() + "TriggerGroup"; CronTrigger cronTrigger = new CronTrigger();
cronTrigger.setName(triggerName);
cronTrigger.setGroup(triggerGroup);
cronTrigger.setJobName(jobName);
cronTrigger.setJobGroup(jobGroup);
try {
cronTrigger.setCronExpression(cronExpression);//触发任务的时间表达式
} catch (Exception e) {
logger.error("",e);
} logger.info("任务 " + jobName + " 触发时间:" + cronExpression);
return cronTrigger;
} /**
* 删除job
*
* @param jobName
* @param jobGroup
*/
public static void removeJob(String jobName, String jobGroup) {
logger.info("删除任务:jobName:" + jobName + " jobGroup:" + jobGroup);
Scheduler scheduler = null;
String[] jobNames = null;
try {
scheduler= (StdScheduler)SpringContextUtil.getBean("schedulerFactoryBean");
jobNames = scheduler.getJobNames(jobGroup);
if (jobNames == null || jobNames.length == 0) {
return;
}
for (String name : jobNames) {
if (name.equals(jobName)) {
scheduler.pauseTrigger(jobName, jobGroup);//停止触发器
scheduler.pauseJob(jobName, jobGroup);//暂停job
scheduler.unscheduleJob(jobName, jobGroup);//取消预订的job
scheduler.deleteJob(jobName, jobGroup);//删除job
}
} } catch (SchedulerException e) {
logger.error("", e);
}
} /**
* 获取任务列表
*
* @return
*/
public static Map<String, List<String>> getJobList() {
Scheduler scheduler = null;
Map<String, List<String>> map = null;
try {
scheduler= (StdScheduler)SpringContextUtil.getBean("schedulerFactoryBean");
String[] jobGroupNames = scheduler.getJobGroupNames();
if (jobGroupNames == null || jobGroupNames.length == 0) {
return null;
} map = new HashMap<String, List<String>>();
for (String jobGroup : jobGroupNames) {
String[] jobNames = scheduler.getJobNames(jobGroup);
if (jobNames == null || jobNames.length == 0) {
continue;
}
List<String> jobNameList = new ArrayList<String>();
for (String jobName : jobNames) {
jobNameList.add(jobName);
}
map.put(jobGroup, jobNameList);
}
} catch (SchedulerException e) {
logger.error("", e);
}
logger.info("获取job列表:" + map);
return map;
}
}

  6.程序中使用

直接抵用

addJob等即可
 

003-spring结合java类调用quartz的更多相关文章

  1. 002-使用java类调用quartz

    一.工具类 package com.tech.jin.jobScheduler; import java.text.ParseException; import java.util.ArrayList ...

  2. Spring Boot普通类调用bean

    1 在Spring Boot可以扫描的包下 假设我们编写的工具类为SpringUtil. 如果我们编写的SpringUtil在Spring Boot可以扫描的包下或者使用@ComponentScan引 ...

  3. 17、Spring Boot普通类调用bean【从零开始学Spring Boot】

    转载:http://blog.csdn.net/linxingliang/article/details/52013017 我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个 ...

  4. (17)Spring Boot普通类调用bean【从零开始学Spring Boot】

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...

  5. Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)

    当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...

  6. Spring框架中,在工具类或者普通Java类中调用service或dao

    spring注解的作用: 1.spring作用在类上的注解有@Component.@Responsity.@Service以及@Controller:而@Autowired和@Resource是用来修 ...

  7. struts1+spring+myeclipse +cxf 开发webservice以及普通java应用调用webservice的实例

    Cxf + Spring+ myeclipse+ cxf 进行  Webservice服务端开发 使用Cxf开发webservice的服务端项目结构 Spring配置文件applicationCont ...

  8. Spring IoC — 基于Java类的配置

    普通的POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供一个Bean的定义信息. 基于Java类的配置方法和基 ...

  9. 普通Java类获取spring 容器的bean的5种方法

    方法一:在初始化时保存ApplicationContext对象方法二:通过Spring提供的工具类获取ApplicationContext对象方法三:继承自抽象类ApplicationObjectSu ...

随机推荐

  1. vi全文替换命令

    1,$s/str1/str2/g:从第一行到最后一行把str1替换成str2

  2. 本地运行storm时报错

    java.lang.NoClassDefFoundError: backtype/storm/topology/IRichSpout at java.lang.Class.getDeclaredMet ...

  3. hihoCoder #1320 : 压缩字符串 区间dp

    /** 题目:hihoCoder #1320 : 压缩字符串 链接:https://hihocoder.com/problemset/problem/1320 描述 小Hi希望压缩一个只包含大写字母' ...

  4. 使用JSP实现用户登录

    本文讲述使用JSP实现用户登录,包括用户登录.注册和退出功能等. 1.系统用例图 2.页面流程图 3.数据库设计 本例使用oracle数据库 创建用户表 包括id,username,password和 ...

  5. JavaScript越来越简单啦啦啦

    我正在对需要从远程API提取并对页面的各个部分进行更改的页面进行更改.听起来像是抽出jQuery和Ajax的时候了,不是吗?相反,我只是使用了老式的JavaScript.实际上,我使用了新的JavaS ...

  6. 集群下使用redis统一session处理

    pom依赖(快照版): <dependency> <groupId>org.springframework.session</groupId> <artifa ...

  7. 在grub的rescue模式修复linux引导

    今天在windows 10系统收到系统更新通知,没看清楚就手贱点了马上更新.以为只是像那些普通更新一样重启一下更新就完了,万万没想到这个是覆盖更新,也就是说这是一个全新的系统更新而不是系统补丁.在安装 ...

  8. php中的 file_get_contents(‘php://input’)

    今天用CI框架整合微信发现了一个没见过的 file_get_contents('php://input'); 这个家伙是干嘛用的,然后自己直接写了验证的代码.好吧 废话不多说直接看下面的代码. < ...

  9. noip模拟题题解集

    最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...

  10. 关于OBJC

    http://www.objc.io/ objc这个站点是:关于objective-c语言的最佳实践和高阶技术的期刊. 看了几期非常不错,所以计划每天抽出时间翻译一篇文章和大家一起分享.