`

quartz定时任务使用

阅读更多

spring quartz(定时任务例子)
一.Quartz介绍
     Quartz是一个作业调度系统(a job scheduling system),负责在约定的时间到达时执行(或通知)其他软件控制。是一个Java的定时任务框架,使用它可以方便的实现计划任务,即在某个时间或每隔一定时间运行一个任务。Quartz的核心是Job/JobDetail,Trigger和Scheduler。

    1.Job/JobDetail
       Job/JobDetail=既要执行的任务,可以通过实现Job(interface)中的excute方法来指定任务的具体操作。 他描述了一个任务具体的信息,比如名称,组名等等。JobDetail对象是在Quartz的客户端(我们的程序)在Job被关联加入到Scheduler时创建的,JobDetail包含了Job的各种属性值和   JobDataMap,JobDataMap中存放了与之相关的Job类实例的状态信息。

    2.Trigger
       用于控制一组Job的触发,包裹SimmperTrigger和CronTrigger,后者支持一种描述触发事件和间隔的表达式语言。Quartz有个很好的想法就是分离了任务和任务执行的条件。Trigger就是控制任务执行条件的类,当Trigger认为执行条件满足的时刻,Trigger会通知相关的Job去执行。分离的好处是:
            1).你可以为某个Job关联多个Trigger,其中任何一个条件满足都可以触发job执行,这样可以完成一些组合的高级触发条件
            2).当Trigger失效后(比如:一个永远都不能满足的条件),你不必去声明一个新的job,代替的是你可以为job关联一个新的Trigger让job可以继续执行。
  
    3.Scheduler是控制和管理触发器的启动和终止。
       使用Scheduler前必须实例化Scheduler,需要由SchedulerFactory类来创建Scheduler,Factory的实例可以通过在JNDI存储中的Factory的序列化的方式获取,实例化Factory后直接使用该实例很容易。如下:
       public class WangyouQuartzListener extends QuartzInitializerListener {
            public  static  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

            public WangyouQuartzListener() {
                       super();
            }

           public void contextInitialized(ServletContextEvent event) {
                    super.contextInitialized(event);
                    String factoryKey = event.getServletContext().getInitParameter("servlet-context-factory-key");
                     if (factoryKey == null) {
                               factoryKey = QUARTZ_FACTORY_KEY;
                      }
                      StdSchedulerFactory factory = (StdSchedulerFactory) event.getServletContext().getAttribute(factoryKey);

                   try {
                         QuartzScheduleHolder.getInstance().setScheduler(factory.getScheduler());
                       //per 2 hours add friends
                       Trigger trigger =  TriggerUtils.makeHourlyTrigger(24);
                       //Trigger trigger =  TriggerUtils.makeSecondlyTrigger(60);
                       trigger.setName(AddNewUserFriendJobDetail.JOB_NAME);
                      trigger.setStartTime(this.getBeforeAfterDate(1,-13));
                      QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new AddNewUserFriendJobDetail(),trigger);
                      //把job和Trigger关联,这样当Trigger认为应该触发的时候就会调用(实际上是Scheduler调用)job.execute方法了。

                      //per 3 day send mail and leave message
                      Trigger trigger2 =  TriggerUtils.makeHourlyTrigger(24*3);
                      trigger2.setStartTime(this.getBeforeAfterDate(1,-12));
                      trigger2.setName(LeaveMessageNewUserJobDetail.JOB_NAME);
                      QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new LeaveMessageNewUserJobDetail(),trigger2);

                       // per 6  recommend video
                      Trigger trigger3 =  TriggerUtils.makeHourlyTrigger(24*7);
                      trigger3.setName(RecommendVideoNewUserJobDetail.JOB_NAME);
                      trigger3.setStartTime(this.getBeforeAfterDate(2,-11));
                      QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new RecommendVideoNewUserJobDetail(),trigger3);

           
                         QuartzScheduleHolder.getInstance().getScheduler().start();
                   } catch (Exception e) {
                        e.printStackTrace();
                   }
              }

             public void contextDestroyed(ServletContextEvent event) {
                   super.contextDestroyed(event);
                     QuartzScheduleHolder.getInstance().setScheduler(null);
             }

              private Date getBeforeAfterDate( int day,int hour){
                       Calendar   cal   =   Calendar.getInstance();
                      cal.add(Calendar.DATE,day);
                     cal.add(Calendar.HOUR,hour);
                     return cal.getTime();
             }
           }
二。Spring Quartz
      Spring的scheduling。quartz包中对Quartz的框架进行封装,使得开发时不用写任何Quartz和Spring的代码就可以实现定时任务。Spring通过JobDetailBean,MethodInvokingJobDetailFactoryBean实现Job的定义,后者更加使用,只需指定要运行的类,和该类中运行的方法即可,Spring将自动生成符合Quartz要求的JobDetail。例如:
      1.jobDetail
         public class SayHelloJob {
   
                   private static  DateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

                   private String message;

                   public String getMessage() {
                           return message;
                  }

                  public void setMessage(String message) {
                            this.message = message;
                 }

                 public void sayHello(){
                          Date date = new Date();
                         System.out.println(dateFormat.format(date)+" :"+this.getMessage() );
                 }
          }
       2.spring的配置文件:quartzbean.xml
           <?xml version="1.0" encoding="UTF-8"?>

           <beans xmlns="http://www.springframework.org/schema/beans"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
                    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

                    <bean name="sayHelloJob" class="com.fg114.takeout.job.SayHelloJob">
                              <property name="message" value="start .............." />
                   </bean>

                   <bean name="sayHelloDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
                              <property name="targetObject" ref="sayHelloJob" />
                             <property name="targetMethod" value="sayHello"/>
                    </bean>

                   <bean name="simpleTriggerBean" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
                                  <!--这里定义定时任务的对象的位置-->
                            <property name="jobDetail" ref="sayHelloDetailBean"/>
                           <!--这里定义每六秒钟程序执行一次-->
                             <property name=""></property>
                            <property name="repeatInterval" value="6000"/>
                           <!--这里定义程序启动两秒钟后开始执行-->
                         <property name="startDelay" value="2000"/>
                    </bean>
                 <! --          启动任务    -->
                   <bean name="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
                         <property name="triggers">
                             <list>
                                  <ref bean="simpleTriggerBean"/>
                            </list>
                       </property>
                  </bean>
             </beans>
3.web.xml :
            加入
           <listener>
             <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
           </listener>
       注意:common-collections.jar 版本布不能是2.1版本的

分享到:
评论

相关推荐

    白色大气风格的旅游酒店企业网站模板.zip

    白色大气风格的旅游酒店企业网站模板.zip

    python实现用户注册

    python实现用户注册

    【图像压缩】基于matlab GUI Haar小波变换图像压缩(含PSNR)【含Matlab源码 9979期】.zip

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    (177354822)java小鸟游戏.zip

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    VB+access学生管理系统(论文+系统)(2024am).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    数学计算中的平方表与圆周率π的应用

    内容概要:文档名为《平方表,派表集合.docx》,主要内容是1至1000的平方值以及1至1000与π的乘积结果。每个数字从1开始,逐步增加至1000,对应地计算了平方值和乘以π后的值。所有计算均通过Python脚本完成,并在文档中列出了详细的计算结果。 适合人群:需要进行数学计算或程序验证的学生、教师和研究人员。 使用场景及目标:用于快速查找特定数字的平方值或其与π的乘积,适用于教学、科研及程序测试等场景。 阅读建议:可以直接查阅所需的具体数值,无需从头到尾逐行阅读。建议在使用时配合相应的计算工具,以验证和拓展数据的应用范围。

    VB+SQL光盘信息管理系统(源代码+系统+答辩PPT)(20244m).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    白色大气风格的健身私人教练模板下载.zip

    白色大气风格的健身私人教练模板下载.zip

    白色简洁风的商务网站模板下载.zip

    白色简洁风的商务网站模板下载.zip

    白色大气风格的前端设计案例展示模板.zip

    白色大气风格的前端设计案例展示模板.zip

    圣诞树项目中的硬件和MATLAB实现指南

    内容概要:本文介绍了两个有趣的圣诞树项目方向:一是使用Arduino或Raspberry Pi开发可编程的圣诞树灯光控制系统;二是基于MATLAB开发一个圣诞树模拟器。前者通过硬件连接、编写Arduino/Raspberry Pi程序、MATLAB控制程序来实现LED灯带的闪烁;后者则通过创建圣诞树图形、添加动画效果、用户交互功能来实现虚拟的圣诞树效果。 适合人群:具备基本电子工程和编程基础的爱好者和学生。 使用场景及目标:①通过硬件和MATLAB的结合,实现实际的圣诞树灯光控制系统;②通过MATLAB模拟器,实现一个有趣的圣诞树动画展示。 阅读建议:读者可以根据自己的兴趣选择合适的项目方向,并按照步骤进行动手实践,加深对硬件编程和MATLAB编程的理解。

    白色扁平风格的温室大棚公司企业网站源码下载.zip

    白色扁平风格的温室大棚公司企业网站源码下载.zip

    Navicat.zip

    Navicat.zip

    Scikit-learn库中主成分分析(PCA)技术的Python实现教程

    内容概要:本文详细介绍了主成分分析(PCA)技术的原理及其在Scikit-learn库中的Python实现。首先讲解了PCA的基本概念和作用,接着通过具体示例展示了如何使用Scikit-learn进行PCA降维。内容涵盖了数据准备、模型训练、数据降维、逆转换数据等步骤,并通过可视化和实际应用案例展示了PCA的效果。最后讨论了PCA的局限性和参数调整方法。 适合人群:数据科学家、机器学习工程师、数据分析从业者及科研人员。 使用场景及目标:适用于高维数据处理,特别是在需要降维以简化数据结构、提高模型性能的场景中。具体目标包括减少计算复杂度、提高数据可视化效果和改进模型训练速度。 其他说明:本文不仅提供了详细的代码示例,还讨论了PCA在手写数字识别和机器学习模型中的应用。通过比较原始数据和降维后数据的模型性能,读者可以更好地理解PCA的影响。

    (175846434)目标检测-将VOC格式的数据集一键转化为COCO和YOLO格式

    VOC格式的数据集转COCO格式数据集 VOC格式的数据集转YOLO格式数据集。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    数字信号处理课程设计.doc

    数字信号处理课程设计.doc

    白色扁平化风格的灯饰灯具销售企业网站模板.zip

    白色扁平化风格的灯饰灯具销售企业网站模板.zip

    华豫佰佳组合促销视图.sql

    华豫佰佳组合促销视图.sql

    白色大气风格的商务团队公司模板下载.zip

    白色大气风格的商务团队公司模板下载.zip

    白色大气风格的VPS销售网站模板.zip

    白色大气风格的VPS销售网站模板.zip

Global site tag (gtag.js) - Google Analytics