Spring&Quartz集成自定义注释
如果想了解如何将Spring与Quartz集成,可以参考Spring + Quartz + JavaMail集成教程 。
作为宠物项目要求的一部分,我必须动态安排工作,并且想到了以下两个选项:
1.使用注释提供作业元数据
2.从数据库加载作业元数据
现在,我想到了继续使用基于注释的方法,并且也希望将其与Spring集成。 这是我的方法。
1.创建一个自定义注解QuartzJob
package com.sivalabs.springsamples.jobscheduler;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;import org.springframework.stereotype.Component;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
@Scope("prototype")
public @interface QuartzJob
{String name();String group() default "DEFAULT_GROUP";String cronExp();
}
2.创建一个ApplicationListener来扫描所有Job实施类,并使用Quartz Scheduler调度它们。
package com.sivalabs.springsamples.jobscheduler;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.JobDetailBean;public class QuartJobSchedulingListener implements ApplicationListener<ContextRefreshedEvent>
{ @Autowiredprivate Scheduler scheduler;@Overridepublic void onApplicationEvent(ContextRefreshedEvent event){try {ApplicationContext applicationContext = event.getApplicationContext();List<CronTriggerBean> cronTriggerBeans = this.loadCronTriggerBeans(applicationContext);this.scheduleJobs(cronTriggerBeans);} catch (Exception e) {e.printStackTrace();}}private List<CronTriggerBean> loadCronTriggerBeans(ApplicationContext applicationContext){Map<String, Object> quartzJobBeans = applicationContext.getBeansWithAnnotation(QuartzJob.class);Set<String> beanNames = quartzJobBeans.keySet();List<CronTriggerBean> cronTriggerBeans = new ArrayList<CronTriggerBean>();for (String beanName : beanNames) {CronTriggerBean cronTriggerBean = null;Object object = quartzJobBeans.get(beanName);System.out.println(object);try {cronTriggerBean = this.buildCronTriggerBean(object);} catch (Exception e) {e.printStackTrace();}if(cronTriggerBean != null){cronTriggerBeans.add(cronTriggerBean);}}return cronTriggerBeans;}public CronTriggerBean buildCronTriggerBean(Object job) throws Exception{CronTriggerBean cronTriggerBean = null;QuartzJob quartzJobAnnotation = AnnotationUtils.findAnnotation(job.getClass(), QuartzJob.class);if(Job.class.isAssignableFrom(job.getClass())){System.out.println("It is a Quartz Job");cronTriggerBean = new CronTriggerBean();cronTriggerBean.setCronExpression(quartzJobAnnotation.cronExp()); cronTriggerBean.setName(quartzJobAnnotation.name()+"_trigger");//cronTriggerBean.setGroup(quartzJobAnnotation.group());JobDetailBean jobDetail = new JobDetailBean();jobDetail.setName(quartzJobAnnotation.name());//jobDetail.setGroup(quartzJobAnnotation.group());jobDetail.setJobClass(job.getClass());cronTriggerBean.setJobDetail(jobDetail); }else{throw new RuntimeException(job.getClass()+" doesn't implemented "+Job.class);}return cronTriggerBean;}protected void scheduleJobs(List<CronTriggerBean> cronTriggerBeans){for (CronTriggerBean cronTriggerBean : cronTriggerBeans) {JobDetail jobDetail = cronTriggerBean.getJobDetail();try {scheduler.scheduleJob(jobDetail, cronTriggerBean);} catch (SchedulerException e) {e.printStackTrace();} }}
}
3.创建一个自定义的JobFactory,以将Spring bean用作Job实现对象。
package com.sivalabs.springsamples.jobscheduler;import org.quartz.Job;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.PropertyAccessorFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;public class SpringQuartzJobFactory extends SpringBeanJobFactory
{@Autowiredprivate ApplicationContext ctx;@Overrideprotected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {@SuppressWarnings("unchecked")Job job = ctx.getBean(bundle.getJobDetail().getJobClass());BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(job);MutablePropertyValues pvs = new MutablePropertyValues();pvs.addPropertyValues(bundle.getJobDetail().getJobDataMap());pvs.addPropertyValues(bundle.getTrigger().getJobDataMap());bw.setPropertyValues(pvs, true);return job;}
}
4.创建Job实施类,并使用@QuartzJob对其进行批注
package com.sivalabs.springsamples.jobscheduler;import java.util.Date;import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;@QuartzJob(name="HelloJob", cronExp="0/5 * * * * ?")
public class HelloJob extends QuartzJobBean
{ @Overrideprotected void executeInternal(JobExecutionContext context)throws JobExecutionException{System.out.println("Hello Job is running @ "+new Date());System.out.println(this.hashCode()); }
}
5.在applicationContext.xml中配置SchedulerFactoryBean和QuartJobSchedulingListener
<beans><context:annotation-config></context:annotation-config><context:component-scan base-package="com.sivalabs"></context:component-scan><bean class="com.sivalabs.springsamples.jobscheduler.QuartJobSchedulingListener"></bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="jobFactory"><bean class="com.sivalabs.springsamples.jobscheduler.SpringQuartzJobFactory"></bean></property></bean></beans>
6.使用测试客户端启动上下文
package com.sivalabs.springsamples;import org.quartz.Job;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.sivalabs.springsamples.jobscheduler.HowAreYouJob;
import com.sivalabs.springsamples.jobscheduler.InvalidJob;public class TestClient
{public static void main(String[] args){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");System.out.println(context); }}
参考: JCG合作伙伴 Siva在“我的技术实验”博客上的 使用自定义批注进行Spring和Quartz集成 。
- Spring,Quartz和JavaMail集成教程
- 在运行时交换出Spring Bean配置
- Spring MVC3 Hibernate CRUD示例应用程序
- 使用Spring将POJO公开为JMX MBean
- Java教程和Android教程列表
翻译自: https://www.javacodegeeks.com/2011/10/spring-quartz-integration-with-custom.html
Spring&Quartz集成自定义注释相关推荐
- 使用SPANN方式将Spring&Quartz与自定义注释集成
在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...
- 通过SPANN方式将Spring&Quartz与自定义注释集成
在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...
- spring aop 注释_使用Spring AOP,自定义注释和反射为您的应用程序审核基础结构
spring aop 注释 下一篇文章将演示如何使用Spring AOP和注释编写简单的审计. 审核机制将是干净,高效且易于维护的(和Kewwl!). 我将在用户管理系统上演示我的示例(假设您具有反射 ...
- 使用Spring AOP,自定义注释和反射为您的应用审核基础架构
下一篇文章将演示如何使用Spring AOP和注释编写简单的审计. 审核机制将是干净,高效且易于维护的(和Kewwl!). 我将在用户管理系统上演示我的示例(假设您对反射和AOP具有一般知识). 我们 ...
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- springboot 集成自定义Quartz
1.创建一个springboot 项目 (因为后面的Quartz需要数据库做持久化所以自己集成mysql) 2.引入Quartz需要的pom文件 <dependency><group ...
- spring使用自定义注解_用Spring组成自定义注释
spring使用自定义注解 Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本 ...
- 用Spring组成自定义注释
Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本文中,我们将介绍一个非常有用 ...
- Spring Boot集成Quartz动态实现数据库任务
1. Quartz简介 1.1. 什么是Quartz Quartz是一个开源的任务调度框架.作用是基于定时.定期的策略来执行任务. 它是OpenSymphony开源组织在Job scheduling领 ...
最新文章
- Spring AOP的一些概念
- 如何在ROS中使用PCL—数据格式(1)
- lightoj 1014
- C# 语言规范_版本5.0 (第10章 类)
- 焦点分析 | 平头哥的首颗 AI 芯片对阿里云来说意味着什么?
- pytorch attention 注意力
- Sql Server相关报错解决
- java8中的函数式数据处理
- 【下拉刷新】WEUI下拉刷新
- python文件读取与输出_python基本文件操作(文件输入和输出)
- 使用selenium和pyquery爬取京东商品列表
- stream 的方式遍历(亲测)
- TensorFolw 报错
- navicat远程mysql_navicat 远程连接mysql
- Hadoop相关问题解决
- 洞悉物联网发展1000问之可穿戴设备的未来会怎样?
- 松下PLC报mewnet设备打开错误----重启电脑就好!!!
- leetcode1776. 车队 II
- VUE3 keep-alive页面切换报错:parentComponent.ctx.deactivate is not a function
- 蓝牙Mesh开发五 Ble Mesh友谊FriendShip之TLSR8258低功耗节点
热门文章
- 移除指定的session
- gradle项目 构建_使用Gradle构建Monorepo项目
- java程序设置jvm_Java程序员应在2018年学习的3种JVM语言
- jdk 1.8 不可变常量_在JDK 10中不可变与不可修改
- jvm gc阻塞时长 占比_jvm进行转义分析需要多长时间? 可能比您想象的要长。
- java cr_WildFly 10 CR 2发布– Java EE 7,Java 8,Hibernate 5,JavaScript支持热重载
- jax-ws 生成soap_在Spring中记录JAX-WS SOAP消息
- java多线程 异常处理_Java8多线程ForkJoinPool:处理异常
- Java中的模板方法模式
- q7goodies事例_Java 8 Friday Goodies:精益并发