我们知道Spring支持与Quartz框架集成。 但是到目前为止,Spring仅支持静态XML声明方法。

如果想了解如何将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集成自定义注释相关推荐

  1. 使用SPANN方式将Spring&Quartz与自定义注释集成

    在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...

  2. 通过SPANN方式将Spring&Quartz与自定义注释集成

    在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...

  3. spring aop 注释_使用Spring AOP,自定义注释和反射为您的应用程序审核基础结构

    spring aop 注释 下一篇文章将演示如何使用Spring AOP和注释编写简单的审计. 审核机制将是干净,高效且易于维护的(和Kewwl!). 我将在用户管理系统上演示我的示例(假设您具有反射 ...

  4. 使用Spring AOP,自定义注释和反射为您的应用审核基础架构

    下一篇文章将演示如何使用Spring AOP和注释编写简单的审计. 审核机制将是干净,高效且易于维护的(和Kewwl!). 我将在用户管理系统上演示我的示例(假设您对反射和AOP具有一般知识). 我们 ...

  5. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  6. springboot 集成自定义Quartz

    1.创建一个springboot 项目 (因为后面的Quartz需要数据库做持久化所以自己集成mysql) 2.引入Quartz需要的pom文件 <dependency><group ...

  7. spring使用自定义注解_用Spring组成自定义注释

    spring使用自定义注解 Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本 ...

  8. 用Spring组成自定义注释

    Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本文中,我们将介绍一个非常有用 ...

  9. Spring Boot集成Quartz动态实现数据库任务

    1. Quartz简介 1.1. 什么是Quartz Quartz是一个开源的任务调度框架.作用是基于定时.定期的策略来执行任务. 它是OpenSymphony开源组织在Job scheduling领 ...

最新文章

  1. Spring AOP的一些概念
  2. 如何在ROS中使用PCL—数据格式(1)
  3. lightoj 1014
  4. C# 语言规范_版本5.0 (第10章 类)
  5. 焦点分析 | 平头哥的首颗 AI 芯片对阿里云来说意味着什么?
  6. pytorch attention 注意力
  7. Sql Server相关报错解决
  8. java8中的函数式数据处理
  9. 【下拉刷新】WEUI下拉刷新
  10. python文件读取与输出_python基本文件操作(文件输入和输出)
  11. 使用selenium和pyquery爬取京东商品列表
  12. stream 的方式遍历(亲测)
  13. TensorFolw 报错
  14. navicat远程mysql_navicat 远程连接mysql
  15. Hadoop相关问题解决
  16. 洞悉物联网发展1000问之可穿戴设备的未来会怎样?
  17. 松下PLC报mewnet设备打开错误----重启电脑就好!!!
  18. leetcode1776. 车队 II
  19. VUE3 keep-alive页面切换报错:parentComponent.ctx.deactivate is not a function
  20. 蓝牙Mesh开发五 Ble Mesh友谊FriendShip之TLSR8258低功耗节点

热门文章

  1. 移除指定的session
  2. gradle项目 构建_使用Gradle构建Monorepo项目
  3. java程序设置jvm_Java程序员应在2018年学习的3种JVM语言
  4. jdk 1.8 不可变常量_在JDK 10中不可变与不可修改
  5. jvm gc阻塞时长 占比_jvm进行转义分析需要多长时间? 可能比您想象的要长。
  6. java cr_WildFly 10 CR 2发布– Java EE 7,Java 8,Hibernate 5,JavaScript支持热重载
  7. jax-ws 生成soap_在Spring中记录JAX-WS SOAP消息
  8. java多线程 异常处理_Java8多线程ForkJoinPool:处理异常
  9. Java中的模板方法模式
  10. q7goodies事例_Java 8 Friday Goodies:精益并发