zoukankan      html  css  js  c++  java
  • spring实现可重置时间定时器

    此文章是基于  搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台

    一. jar包介绍

      1. spring-framework-4.3.4.RELEASE 的 libs 文件夹下得到:

    spring-context-support-4.3.4.RELEASE.jar

      2. quartz-2.2.3.jar

    二. 相关文件介绍

      1. applicationInfrastructure.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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">  
        
        <!-- 定时器bean类定义 -->
        <bean id="flexTimeJob" class="com.ims.infrastructure.quartz.FlexTimeJob">
            <!-- 指定定时器调度工厂 -->
            <property name="scheduler" ref="flexTimeSchedulerFactory" />
            <!-- 向定时器注入bean -->
        </bean>
        
        <!-- 任务定义 -->    
        <bean id="flexTimeJobDetail" 
            class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <!-- 任务所在的类 -->
            <property name="targetObject" ref="flexTimeJob" />
            <!-- 任务所对应的方法名 -->
            <property name="targetMethod" value="executeInternal" />
            <property name="concurrent" value="false" />
        </bean>    
        
        <!-- 任务触发器  -->
        <bean id="flexTimeJobTrigger" 
            class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail" ref="flexTimeJobDetail"/>
            <property name="cronExpression" value="0 0 0 ? * *"/>    <!-- 默认每天凌晨0点整打印  -->          
            <property name="startDelay" value="10000"/>         <!-- 延迟10秒(10000毫秒)启动 -->
        </bean>
        
        <!-- 调度工厂,触发器集合 -->
        <bean id="flexTimeSchedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list> 
                    <ref bean="flexTimeJobTrigger"/>              
                </list>
            </property>
        </bean>    
        
    </beans>
    View Code


      2. FlexTimeJob.java,定时器任务类

    package com.ims.infrastructure.quartz;
    
    import org.quartz.CronScheduleBuilder;
    import org.quartz.CronTrigger;
    import org.quartz.Scheduler;
    import org.quartz.TriggerKey;
    
    public class FlexTimeJob {
         /**
         * 调度工厂,可取得所属的触发器
         */
        private Scheduler scheduler; 
        
        /**
         * 定时任务执行的方法
         */
        protected void executeInternal(){
            System.out.println("hello!");
        }
        
        /**
         * 重置定时时间任务的方法
         */
        public void resetTime(String time)throws Exception{  
            String cronExpression = transformTime(time);// 时间格式如:13:30
            TriggerKey triggerKey = TriggerKey.triggerKey("flexTimeJobTrigger",Scheduler.DEFAULT_GROUP);
            CronTrigger trigger =  (CronTrigger)scheduler.getTrigger(triggerKey);        
            String originConExpression = trigger.getCronExpression();            
            if(!originConExpression.equalsIgnoreCase(cronExpression)){   
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
             
                //按新的cronExpression表达式重新构建trigger
                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                        .withSchedule(scheduleBuilder).build();
            
                //按新的trigger重新设置job执行
                scheduler.rescheduleJob(triggerKey, trigger);
            }      
        }
        
        /**
         * 将时间转换为cron表达式
         * @param time 时间字符串,格式如:13:30
         * @return
         */
        private String transformTime(String time){
            StringBuffer result = new StringBuffer();
            String[] arr = time.split(" ");
            String[] timeArr = arr[0].split(":");
            result.append("0 "+timeArr[1]+" "+timeArr[0]);
            result.append(" ? * *");
            return result.toString();
        }
    
        public Scheduler getScheduler() {
            return scheduler;
        }
        public void setScheduler(Scheduler scheduler) {
            this.scheduler = scheduler;
        }
    
    }
    View Code


      3. flexTime.jsp

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <html>
     <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>测试</title>
        <%@ include file="/common/basePath.jsp"%>
     </head>
     <body>
     ~~~~~~~~~~~~~~~~~~~~~~可重置时间定时器~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     <br><br>
     <input type="text" name="time" id="time"> 时间格式如:13:30
     <br><br>
     <button type="button" onclick="resetTime();">设置</button>
     <br><br><br>
    
     <script type="text/javascript" src="content/js/jquery/jquery-1.8.1.min.js"></script>
     <script type="text/javascript">
        
        function resetTime(){
            $.ajax({
                 url:rootPath+"/test/flexTimeJob!reset.do?time="+$('#time').val(),
                 async:false
             });    
        }
    
     </script>
     </body>
    </html>
    View Code


    三. 测试

      访问:http://localhost:8080/ims/test/flexTime.do,默认每天凌晨0时,后台会输出"hello!",重置后每天按时间定时输出

  • 相关阅读:
    C语言(1)
    ​ Markdown
    多功能嵌入式解码软件(4)
    多功能嵌入式解码软件(3)
    多功能嵌入式解码软件(2)
    STM32最小系统设计
    C#通过字符串分割字符串Split
    基于串口的SD_card系统
    直流无刷电机工作原理
    Java常用函数式接口--Consumer接口使用案例
  • 原文地址:https://www.cnblogs.com/Mr-kevin/p/5561303.html
Copyright © 2011-2022 走看看