一、利弊

  针对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. Linux_Command

    系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...

  2. 打包iOS应用程序

    如果想要将做的iOS应用程序装到自己的iOS设备上测试.或者装在别人的iOS设备上,或者想发布到App Store里,先要给应用签名.签名就要有证书,这就需要申请证书的过程了. 把自己的应用程序装到设 ...

  3. Chrome调试ECMAScript之断点debug技巧大全!

    这篇文章主要介绍了使用Chrome调试JavaScript的断点设置和调试技巧,需要的朋友可以参考下 你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍 ...

  4. shell变量自增 || Python脚本接收参数

    一.shell变量自增a=1a=$(($a+1))a=$[$a+1]a=`expr $a + 1`let a++ let a+=1 ((a++)) echo $a 二.python脚本接收参数 fro ...

  5. 常用cms

    最近,朋友要建站让我帮着推荐个好的CMS(内容管理系统),个人认为其实选择哪个CMS并不重要,除了对搜索引擎的亲好外,个人的使用操作习惯和对所选CMS系统的熟悉程度有很大关系. 这里为需要建站但又徘徊 ...

  6. MySQL Migration Toolkit启动报jre错误

    正常启动的话,会报出“an error occurred during the initialization of the runtime system.Please make sure you ha ...

  7. SQLServer2008设置开启远程连接

    SQL Server 2008默认是不允许远程连接的,sa帐户默认禁用的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,需要做两个部分的配置:    1,SQL Serve ...

  8. [Hadoop]安装

    1 从官网下载hadoop稳定版 http://www.apache.org/dyn/closer.cgi/hadoop/common/ 2 安装JAVA 参考如下blog http://www.cn ...

  9. NSTimer的循环引用

    在日常开发中想到会引起循环引用的一般比较容易想起的是 1.delegate 2.block 今天要说的就是另外一个,NSTimer 这个比较容易会被忽略掉 简单的说就是创建timer为成员变量的时候t ...

  10. Android 热修复 Tinker接入及源代码浅析

    本文已在我的公众号hongyangAndroid首发.转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/54882693本文出自张鸿 ...