热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

基于Spring实现定时调度

比较常用的是,Spring对Quartz的支持,可以非常容易地进行定时任务的调度。一般,具有两种方式实现定时调度:一种是通过继承Spring的org.springframework.scheduling.quartz.QuartzJobBean来定义定时任务,这种情况下与Spring代码有一定耦合。下面,通过例

比较常用的是,Spring对Quartz的支持,可以非常容易地进行定时任务的调度。一般,具有两种方式实现定时调度:

一种是通过继承Spring的org.springframework.scheduling.quartz.QuartzJobBean来定义定时任务,这种情况下与Spring代码有一定耦合。下面,通过例子来说明:

实现一个定时任务类,代码如下所示:

  1. package org.shirdrn.spring.scheduler.quartz;  
  2.   
  3. import org.apache.log4j.Logger;  
  4. import org.quartz.JobExecutionContext;  
  5. import org.quartz.JobExecutionException;  
  6. import org.springframework.scheduling.quartz.QuartzJobBean;  
  7.   
  8. public class MyQuartzJob extends QuartzJobBean {  
  9.   
  10.     private static final Logger LOG = Logger.getLogger(MyQuartzJob.class);  
  11.     private static int counter = 0;  
  12.   
  13.     @Override  
  14.     protected void executeInternal(JobExecutionContext context)  
  15.             throws JobExecutionException {  
  16.         JobControlInfo job = (JobControlInfo) context.getMergedJobDataMap().get("jobControlInfo");  
  17.         String manager = (String) context.getMergedJobDataMap().get("manager");  
  18.         int length = Integer.parseInt((String) context.getMergedJobDataMap().get("length"));  
  19.         LOG.info("context: job=" + job + ", manager=" + manager + ", length=" + length);  
  20.         LOG.info("Execute quartz job /"" + (++counter) + "/".");  
  21.     }  
  22. }  

上面的JobExecutionContext context是一个任务执行上下文,可以通过配置,将需要的数据传递给executeInternal方法,然后在该方法中定义任务的处理逻辑。

这里,假设有一个类包含了对定时任务的控制信息,实现类为JobControlInfo,形式化定义如下所示:

  1. package org.shirdrn.spring.scheduler.quartz;  
  2.   
  3. public class JobControlInfo {  
  4.   
  5. }  

通过Spring配置传递给JobExecutionContext context。

Spring配置文件quartz.xml的内容,如下所示:

  1. xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  5.       
  6.     <bean id="myScheduler" lazy-init="false" autowire="no"  
  7.         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  8.         <property name="triggers">  
  9.             <list>  
  10.                 <ref bean="myQuartzJobTrigger" />  
  11.             list>  
  12.         property>  
  13.     bean>  
  14.     <bean id="myQuartzJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
  15.         <property name="jobDetail" ref="myQuartzJobDetail" />  
  16.         <property name="startDelay" value="5000"/>  
  17.         <property name="repeatInterval" value="2000" />  
  18.     bean>  
  19.     <bean id="myQuartzJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">  
  20.         <property name="jobClass">  
  21.             <value>org.shirdrn.spring.scheduler.quartz.MyQuartzJobvalue>  
  22.         property>  
  23.         <property name="jobDataAsMap">  
  24.             <map>  
  25.                 <entry key="jobControlInfo" value-ref="jobControlInfo" />  
  26.                 <entry key="length" value="100000" />  
  27.                 <entry key="manager" value="Jack" />  
  28.             map>  
  29.         property>  
  30.     bean>  
  31.     <bean id="jobControlInfo" class="org.shirdrn.spring.scheduler.quartz.JobControlInfo" scope="prototype"/>  
  32.   
  33. beans>  

下面可以启动定时任务了,代码如下所示:

  1. package org.shirdrn.spring.scheduler.quartz;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6.   
  7. import org.quartz.impl.StdScheduler;  
  8. import org.springframework.context.ApplicationContext;  
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  10.   
  11. public class ContextInitializer {  
  12.     public static void main(String[] args) {  
  13.         ApplicationContext ctx = new ClassPathXmlApplicationContext(  
  14.                 "org/shirdrn/spring/scheduler/quartz/quartz.xml");  
  15.         StdScheduler myScheduler = (StdScheduler)ctx.getBean("myScheduler");  
  16.         BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));  
  17.         try {  
  18.             while(true) {  
  19.                 String line = reader.readLine();  
  20.                 if(line!=null) {  
  21.                     boolean quit = line.trim().equalsIgnoreCase("quit") || line.trim().equalsIgnoreCase("q");  
  22.                     if(quit) {  
  23.                         myScheduler.shutdown(true);  
  24.                         break;  
  25.                     }  
  26.                 }  
  27.             }  
  28.         } catch (IOException e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.     }  
  32. }  

我们定义这个定时任务,执行时间间隔为2s。 

另一种是完全与Spring代码解耦合,而只是通过Spring配置就能进行定时任务的配置,一个定时任务可以是任意的Java处理类。而对于定时的配置,是基于Unix系统的crontab命令来实现的,更加灵活地配置定时任务。

下面说明实现方法:

定义一个普通的Java类,里面的一个方法里面包含了定时任务的处理逻辑,如下所示:

  1. package org.shirdrn.spring.scheduler.quartz.cron;  
  2.   
  3. import org.apache.log4j.Logger;  
  4.   
  5.   
  6. public class MyQuartzJob {  
  7.   
  8.     private static final Logger LOG = Logger.getLogger(MyQuartzJob.class);  
  9.     private static int counter = 0;  
  10.       
  11.     public void scan() {  
  12.         LOG.info("Execute quartz job /"" + (++counter) + "/".");  
  13.     }  
  14. }  

推荐阅读
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了在使用MSXML解析XML文件时出现DTD禁用问题的解决方案。通过代码示例和错误信息获取方法,解释了默认情况下DTD是禁用的,以及如何启用DTD的方法。此外,还提到了网上关于该问题的信息相对较少,因此本文提供了解决方案以供参考。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
author-avatar
用户rmgq8prdxo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有