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!",重置后每天按时间定时输出

 

posted on 2016-06-05 18:03  大饼酥  阅读(1821)  评论(0编辑  收藏  举报

导航