zoukankan      html  css  js  c++  java
  • Spring(十)Spring任务调度

    一、计划任务

    需要定时执行一些计划(定时更新等),这样的计划称之为计划任务

    Spring抽象封装了Java提供的Timer与TimerTask类

    也可以使用拥有更多任务计划功能的Quartz

    二、TimerTask

    2.1、继承TimerTask类重写run方法

     

    实现类

    package com.pb.task.timertask;
    
    import java.util.Iterator;
    import java.util.List;
    import java.util.TimerTask;
    
    public class BatchUpdate extends TimerTask {
        //存放SQL
        private List commons;
        @Override
        public void run() {
            //输出语句
            for(Iterator it=commons.iterator();it.hasNext();){
                System.out.println(it.next());
            }
            System.out.println("timertask批量更新完毕");
        }
        public void setCommons(List commons) {
            this.commons = commons;
        }
    
        
        
    }

    配置文件:

    <?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-3.1.xsd">
    
    <bean id="batch_update" class="com.pb.task.timertask.BatchUpdate">
    <property name="commons">
    <list>
    <value>update personn set onduty="出勤" where date=${ontime}</value>
    <value>update personn set onduty="缺勤" where date=${miss}</value>
    <value>update personn set onduty="迟到" where date=${late}</value>
    <value>update personn set onduty="早退" where date=${early}</value>
    </list>
    </property>
    </bean>
    
    <!-- 配置任务调度的类 -->
    <bean id="update_schuleTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
    <property name="timerTask" ref="batch_update"/>
    <!--启动任务后多久开始执行  -->
    <property name="delay">
    <value>1000</value>
    </property>
    <!--第一次记动后后多久执行一次  2秒重复一次-->
    <property name="period">
    <value>2000</value>
    </property>
    </bean>
    <!--启动任务  -->
    <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
    <!--任务调度类  -->
    <property name="scheduledTimerTasks">
    <list>
    <ref local="update_schuleTask"/>
    </list>
    </property>
    </bean>
    </beans>

    测试类只需要调用

    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

    2.2、使用Spring提供的MethodInvokingTimerTaskFactoryBean定义计划任务

    package com.pb.task.timertask;
    
    import java.util.Iterator;
    import java.util.List;
    import java.util.TimerTask;
    
    public class MethodInvokingBatchUpdate {
        //存放SQL
        private List commons;
        
        public void run() {
            //输出语句
            for(Iterator it=commons.iterator();it.hasNext();){
                System.out.println(it.next());
            }
            System.out.println("MethodInvoking批量更新完毕");
        }
        public void setCommons(List commons) {
            this.commons = commons;
        }
    
        
        
    }

    配置文件

    <?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-3.1.xsd">
    
    <bean id="batch_update" class="com.pb.task.timertask.MethodInvokingBatchUpdate">
    <property name="commons">
    <list>
    <value>update personn set onduty="出勤" where date=${ontime}</value>
    <value>update personn set onduty="缺勤" where date=${miss}</value>
    <value>update personn set onduty="迟到" where date=${late}</value>
    <value>update personn set onduty="早退" where date=${early}</value>
    </list>
    </property>
    </bean>
    <!--配置方法的调用类  -->
    <bean id="methodInvoking" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
    <property name="targetObject" ref="batch_update"></property>
    <property name="targetMethod" value="run"/>
    
    </bean>
    
    <!-- 配置任务调度的类 -->
    <bean id="update_schuleTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
    <property name="timerTask" ref="methodInvoking"/>
    <!--启动任务后多久开始执行  -->
    <property name="delay">
    <value>1000</value>
    </property>
    <!--第一次记动后后多久执行一次  2秒重复一次-->
    <property name="period">
    <value>2000</value>
    </property>
    </bean>
    <!--启动任务  -->
    <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
    <!--任务调度类  -->
    <property name="scheduledTimerTasks">
    <list>
    <ref local="update_schuleTask"/>
    </list>
    </property>
    </bean>
    </beans>

    三、QuartzJobBean实现

    传统QuartzJob

    需要jta.jar 和quartz-all-1.6.0.jar2个jar包

    package com.pb.quartz.job;
    
    import java.util.Date;
    
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.scheduling.quartz.QuartzJobBean;
    
    /**
     * 传统的使用Quartz
     *
     */
    public  class QuartzUpdate extends QuartzJobBean {
        private String command;
        
        @Override
        protected void executeInternal(JobExecutionContext context)
                throws JobExecutionException {
            System.out.println(new Date()+":"+"传统Quartz任务被高度");
            for (int i = 1; i <= 10; i++) {
                System.out.println("命令:"+command+"第"+i+"次被谳用");
                
            }
            System.out.println(new Date()+"传统Quartz调度完成");
        }
        public void setCommand(String command) {
            this.command = command;
        }
    
        
    
    }

    配置文件

    <?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-3.1.xsd">
    
    <!--配置传统方式创建Quartz  -->
    <bean id="t_quartz" class="org.springframework.scheduling.quartz.JobDetailBean">
    <!--配置哪个类  -->
    <property name="jobClass">
    <!--关联  -->
    <value>com.pb.quartz.job.QuartzUpdate</value>
    </property>
    
    <!-- 赋值-->
    <property name="jobDataAsMap">
    <map>
    <entry key="command">
    <value>更新</value>
    </entry>
    </map>
    </property>
    </bean>
    
    <!--配置触发器简单触发器  -->
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail" ref="t_quartz"/>
    <!--启动时间  -->
    <property name="startDelay">
    <value>1000</value>
    </property>
    <!--间隔  -->
    <property name="repeatInterval">
    <value>2000</value>
    </property>
    </bean>
    <!--启动任务  -->
    <bean id="quartzFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
    <list>
    <ref local="simpleTrigger"/>
    </list>
    </property>
    </bean>
    </beans>

    使用MethodInvoking方式

    package com.pb.quartz.methodinvoking.update;
    
    public class UpdateQuartzJob {
        
        private String command;
        
        public void show(){
            System.out.println("MethodInvoking方式调度开始"+command);
            for (int i = 1; i <=10; i++) {
                System.out.println("命令:"+command+"第"+i+"次调用");
            }
            System.out.println("MethodInvoking方式调度结束"+command);
        }
    
        public String getCommand() {
            return command;
        }
    
        public void setCommand(String command) {
            this.command = command;
        }
        
    
    }

    配置文件

    <?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-3.1.xsd">
    <!-- 执行的Bean -->
    <bean id="updateQuartzJob" class="com.pb.quartz.methodinvoking.update.UpdateQuartzJob">
    <property name="command">
    <value>Spring新型更新或者插入</value>
    </property>
    </bean>
    <!-- 新的通过方式调用的 -->
    <bean id="methodInvoking" class="    org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <!--哪个类要被调用  -->
    <property name="targetObject" ref="updateQuartzJob"/>
    <!--哪个方法要执行  -->
    <property name="targetMethod" value="show"/>
    </bean>
    <!--配置触发器定时触发器  -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="methodInvoking"/>
    <!--表达式  -->
    <property name="cronExpression">
    <!-- 每天23:17:01秒调用 -->
    <value>02 17 23 * * ?</value>
    </property>
    </bean>
    
    <!--启动任  -->
    <bean id="quartzFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <!--触发器名字  -->
    <property name="triggers">
    <list>
    <ref local="cronTrigger" />
    </list>
    </property>
    </bean>
    
    
    </beans>
  • 相关阅读:
    1014 Waiting in Line (30)(30 point(s))
    1013 Battle Over Cities (25)(25 point(s))
    1012 The Best Rank (25)(25 point(s))
    1011 World Cup Betting (20)(20 point(s))
    1010 Radix (25)(25 point(s))
    1009 Product of Polynomials (25)(25 point(s))
    1008 Elevator (20)(20 point(s))
    1007 Maximum Subsequence Sum (25)(25 point(s))
    1006 Sign In and Sign Out (25)(25 point(s))
    1005 Spell It Right (20)(20 point(s))
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4419913.html
Copyright © 2011-2022 走看看