Quartz与Spring的整合使用——创建JobDetail的方式及Trigger
2017-10-25 00:00
513 查看
摘要: Quartz与Spring的整合使用——创建JobDetail的方式及Trigger
之前说到过Quartz的基本使用(猛戳这里看文章),在实际使用中,我们通常会将定时任务交由spring容器来管理,所以今天我们来说说Quartz与spring的整合。
咱们还是按照Quartz的三大元素的顺序来聊聊整合使用。
JobDetailFactoryBean
spring对这个类的解释为:A Spring FactoryBean for creating a Quartz JobDetail instance, supporting bean-style usage for JobDetail configuration.
一个用于创建Quartz JobDetail实例的,支持以bean定义风格来配置JobDetail的工厂bean。
对于在spring中的使用也是很简单,首先我们需要创建一个具体的作业任务的实现类。使用JobDetailFactoryBean来管理作业任务时,我们的作业任务实现类需要继承QuartzJobBean类,并覆盖其executeInternal方法。就像下面这样。
然后就在spring容器中如下配置:
MethodInvokingJobDetailFactoryBean
spring对这个类的解释:FactoryBean that exposes a JobDetail object which delegates job execution to a specified (static or non-static) method.
这个FactoryBean提供JobDetail对象,这个对象可以指定作业任务的执行方法。
因为可以指定作业调度时执行的内容,所以使用起来就比JobDetailFactoryBean更加的灵活方便。首先我们还是创建一个作业任务的具体实现类,这个实现类就不需要继承或实现其他的父类,只需要将我们想要执行的作业任务声明在具体的方法中即可。如下:
然后在spring容器中如下配置即可:
以上就是作业任务的相关内容,下面我们来看看触发器这个可爱的小东东。
simpleTrigger
cronTrigger
以上就是触发器的基本配置,上述两个触发器的工厂bean还有一些其他的属性,例如jobDataMap,priority等等。如果有需要,您可以参考相关的文档。
猛戳这里下载源代码
说明:本文介绍的是Quartz与Spring的整合使用,所以请参考源码时关注com.earl.quartz.spring包下内容即可,其他可自行忽略。
value的值 用于Job中获取application上下文对象。 即设置 APPLICATION_CONTEXT_KEY 的值
之前说到过Quartz的基本使用(猛戳这里看文章),在实际使用中,我们通常会将定时任务交由spring容器来管理,所以今天我们来说说Quartz与spring的整合。
咱们还是按照Quartz的三大元素的顺序来聊聊整合使用。
作业任务
在spring中对于Quartz的作业任务管理主要提供了两种方式,JobDetailFactoryBean和MethodInvokingJobDetailFactoryBean,它们都在org.springframework.scheduling.quartz这个包下。下面我们来看看它们的使用。JobDetailFactoryBean
spring对这个类的解释为:A Spring FactoryBean for creating a Quartz JobDetail instance, supporting bean-style usage for JobDetail configuration.
一个用于创建Quartz JobDetail实例的,支持以bean定义风格来配置JobDetail的工厂bean。
对于在spring中的使用也是很简单,首先我们需要创建一个具体的作业任务的实现类。使用JobDetailFactoryBean来管理作业任务时,我们的作业任务实现类需要继承QuartzJobBean类,并覆盖其executeInternal方法。就像下面这样。
public class SimpleJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { System.out.println("现在时间为:"+new Date()); //可以通过上下文获取到JobDataMap,这里面可以存放一些参数类型的数据 JobDataMap dataMap=arg0.getMergedJobDataMap(); String wish=(String) dataMap.get("wish"); System.out.println(wish); } }
然后就在spring容器中如下配置:
<bean id="jobDetailFactoryBeanExample" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- 参考源码,我们可以看到属性jobClass为Class类型,所以不能使用ref来引用一个bean,否则就会因为不能将bean转换为Class类型而出现异常。 <property name="jobClass" ref="simpleJob"/> 必须使用value对jobClass赋值。 <property name="jobClass" value="com.earl.quartz.spring.job.SimpleJob"/> --> <property name="jobClass" value="com.earl.quartz.spring.job.SimpleJob"/> <!-- 这里设置的jobDataAsMap可以传递一些参数给作业任务 --> <property name="jobDataAsMap"> <map> <entry key="wish" value="hello"/> </map> </property> </bean>
MethodInvokingJobDetailFactoryBean
spring对这个类的解释:FactoryBean that exposes a JobDetail object which delegates job execution to a specified (static or non-static) method.
这个FactoryBean提供JobDetail对象,这个对象可以指定作业任务的执行方法。
因为可以指定作业调度时执行的内容,所以使用起来就比JobDetailFactoryBean更加的灵活方便。首先我们还是创建一个作业任务的具体实现类,这个实现类就不需要继承或实现其他的父类,只需要将我们想要执行的作业任务声明在具体的方法中即可。如下:
public class ExampleJob{ public void execute(){ System.out.println("现在是"+new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())); } }
然后在spring容器中如下配置即可:
<!-- 如果两个触发器触发同一个作业,那么第二个作业可能在第一个作业完成之前被触发。 将作业类实现StatefulJob接口就可以避免这种情况。 将concurrent设置为false可以避免并发的发生。 --> <!-- 使用MethodInvokingJobDetailFactoryBean来创建作业对象 --> <bean id="exampleJob" class="com.earl.quartz.spring.job.ExampleJob"/> <bean id="methodInvokingJobDetailFactoryBeanExample" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 目标对象,指的是作业任务的实现类 --> <property name="targetObject" ref="exampleJob"/> <!-- 目标方法,指的是指定实现类中的哪个方法作为调度时的执行方法 --> <property name="targetMethod" value="execute"/> <!-- 是否并发 --> <property name="concurrent" value="false"/> </bean>
以上就是作业任务的相关内容,下面我们来看看触发器这个可爱的小东东。
触发器
在spring中,触发器也分为simpleTrigger和cronTrigger,而且它们的使用也是非常简单,只需要配置一个bean元素即可。下面我们分别看看它们两者的配置:simpleTrigger
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <!-- 这里的JobDetail指的就是我们配置的作业任务的bean --> <property name="jobDetail" ref="methodInvokingJobDetailFactoryBeanExample" /> <!-- 延迟5秒开始 --> <property name="startDelay" value="5000"></property> <!-- 每3秒重复一次 --> <property name="repeatInterval" value="3000"></property> </bean>
cronTrigger
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 这里的JobDetail指的就是我们配置的作业任务的bean --> <property name="jobDetail" ref="jobDetailFactoryBeanExample"/> <!--cronExpression,cron表达式--> <property name="cronExpression" value="40 52 17 * * ?"/> </bean>
以上就是触发器的基本配置,上述两个触发器的工厂bean还有一些其他的属性,例如jobDataMap,priority等等。如果有需要,您可以参考相关的文档。
调度程序
最后,最简单的莫过于作业调度程序了,在spring中只需要这样配置即可:<bean id="startQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false"> <!--指定使用哪些触发器,spring会去调度触发相应的触发器,进而对作业任务进行调度处理--> <property name="triggers"> <list> <!-- <ref bean="simpleTrigger"/> --> <ref bean="cronTrigger"/> </list> </property> </bean>
总结
以上就是对Quartz与Spring的整合使用的基本介绍了。总体来说,Quartz的定时任务功能已经很强大了,而spring对其的整合更是让程序员在使用定时任务是如虎添翼。对于Quartz来说还有很多其他的功能,例如定时文件扫描,定时发送邮件等等,之后在另外一篇文章中再进行详细介绍。猛戳这里下载源代码
说明:本文介绍的是Quartz与Spring的整合使用,所以请参考源码时关注com.earl.quartz.spring包下内容即可,其他可自行忽略。
如何从Job中获取ApplicationContext对象:
在xml配置文件中 加入applicationContextSchedulerContextKey配置<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <!-- <ref bean="simpleTrigger" />--> <ref bean="cronTrigger" /> </list> </property> <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/> </bean>
value的值 用于Job中获取application上下文对象。 即设置 APPLICATION_CONTEXT_KEY 的值
public class ScheduledJob extends QuartzJobBean { private static final String APPLICATION_CONTEXT_KEY = "applicationContextKey"; private AnotherBean anotherBean; @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { ApplicationContext applicationContext = null; try{ applicationContext = getApplicationContext(context); }catch (Exception e){ e.printStackTrace(); } if(applicationContext != null){ System.out.println("applicationContext"); ((AnotherBean)(applicationContext.getBean("anotherBean"))).printAnotherMessage(); } } private ApplicationContext getApplicationContext(JobExecutionContext context) throws Exception { ApplicationContext appCtx = null; appCtx = (ApplicationContext) context.getScheduler().getContext().get(APPLICATION_CONTEXT_KEY); if (appCtx == null) { throw new JobExecutionException("No application context available in scheduler context for key \"" + APPLICATION_CONTEXT_KEY + "\""); } return appCtx; } }
相关文章推荐
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(MethodInvokingJobDetailFactoryBean方式)
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- spring+quartz两种整合方式:代码创建job+xml配置创建job
- web 项目 任务调度 Spring整合Quartz(JobDetailBean方式)
- Quartz学习--Spring整合Quartz(MethodInvokingJobDetailFactoryBean方式)
- Quartz学习(七)--Spring整合Quartz(MethodInvokingJobDetailFactoryBean方式)
- Quartz学习(七)--Spring整合Quartz(JobDetailBean方式)
- Spring 整合Quartz两种方式(JobDetailBean和MethodInvokingJobDetailFactoryBean方式)
- Spring整合Quartz(JobDetailBean方式)
- Spring 整合Quartz两种方式比较(JobDetailBean和MethodInvokingJobDetailFactoryBean方式)
- Spring整合Quartz(JobDetailBean方式)
- Spring 整合 Quartz -JOB类型 与 动态设定Trigger参数(二)
- Spring整合quartz两种方式以及Spring轮询定时使用
- Spring整合quartz配置【一】基于MethodInvokingJobDetailFactoryBean实现任务管理
- 使用Spring(17)Spring中的定时调度(Scheduling)--传统方式创建Quartz任务
- pring整合Quartz(JobDetailBean方式)