003-spring结合java类调用quartz
一、利弊
针对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的更多相关文章
- 002-使用java类调用quartz
一.工具类 package com.tech.jin.jobScheduler; import java.text.ParseException; import java.util.ArrayList ...
- Spring Boot普通类调用bean
1 在Spring Boot可以扫描的包下 假设我们编写的工具类为SpringUtil. 如果我们编写的SpringUtil在Spring Boot可以扫描的包下或者使用@ComponentScan引 ...
- 17、Spring Boot普通类调用bean【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/52013017 我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个 ...
- (17)Spring Boot普通类调用bean【从零开始学Spring Boot】
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...
- Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)
当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...
- Spring框架中,在工具类或者普通Java类中调用service或dao
spring注解的作用: 1.spring作用在类上的注解有@Component.@Responsity.@Service以及@Controller:而@Autowired和@Resource是用来修 ...
- struts1+spring+myeclipse +cxf 开发webservice以及普通java应用调用webservice的实例
Cxf + Spring+ myeclipse+ cxf 进行 Webservice服务端开发 使用Cxf开发webservice的服务端项目结构 Spring配置文件applicationCont ...
- Spring IoC — 基于Java类的配置
普通的POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供一个Bean的定义信息. 基于Java类的配置方法和基 ...
- 普通Java类获取spring 容器的bean的5种方法
方法一:在初始化时保存ApplicationContext对象方法二:通过Spring提供的工具类获取ApplicationContext对象方法三:继承自抽象类ApplicationObjectSu ...
随机推荐
- IDEA2017 导入 SVN上的 Myeclipse或Eclipse 项目
从SVN上检出项目,不用打开. 关闭IDEA后选择 import project,导入后按F4 (改成eclipse按键模式后 按ctrl alt shift F4)进入 project struct ...
- Challenge-2.1.4 部分和问题
部分和问题 描写叙述 给定整数a1.a2........an.推断能否够从中选出若干数,使它们的和恰好为K. 输入 首先,输入n.表示数的个数. 接着一行n个数. (1<=n<=20,保证 ...
- jQuery 实战读书笔记之第四章:使用特性、属性和数据
使用属性 /* 每个元素都有一或多个特性,,这些特性的用途是给出相应元素或其内容的附加信息.(出自 JavaScript 高级程序设计) */ /* 特性是固有的 JavaScript 对象 属性指的 ...
- maven项目编译:程序包com.sun.image.codec.jpeg不存在 这个类文件的位置在jre/lib/rt.jar
转载:http://superich2008.iteye.com/blog/2047830 失败提示信息为:程序包com.sun.image.codec.jpeg不存在 这个类文件的位置在jre/li ...
- redis-3.0.6安装
此redis用来缓存跨屏账户绑定信息,安装步骤如下: ssh root@redis.td.com ,注意是root用户 tar -xzvf /nfs/install/softs/redis-3.0.4 ...
- 当input被选中时候获取改input的多个属性值
<input name="selectTicket" class="selectTic" data-property="${couponDeta ...
- php 判断是否在微信浏览器中打开
<?php $a=false; $b=$_SERVER['HTTP_USER_AGENT']; if(strpos($b,"MicroMessenger")===false) ...
- 关闭ReSharper中的[ Use 'var' ]提示(Disable C# “var” Recommendation in ReSharper)
ReSharper,确实是个很不错的工具,代码如果写得不规范他会提示,而且可以根据自己公司的需求自定义代码规范. 默认设置的提示已经相当完美,但美中不足就是老提示你用var来代替所有类型. 按以下步骤 ...
- 分享一个Unity3D小作品,源码地址已公布在文章开头!
Update:回复量有点大,楼主工作期间可能无暇向童鞋们发送源码,为了不让童鞋们久等,现公布源码地址. 链接: http://pan.baidu.com/s/1sjpYW4d 密码: zhp9 请注 ...
- retrival and clustering : week 3 k-means 笔记
华盛顿大学 machine learning 笔记. K-means algorithm 算法步骤: 0. 初始化几个聚类中心 (cluster centers)μ1,μ2, … , μk 1. 将所 ...