zoukankan      html  css  js  c++  java
  • 自动任务调度

    一、概述:

    最近维护一个老项目,里面使用的是Timer的时间调度器,以前没接触过,对着代码鼓捣了半天,查阅了部分博客,最后总结出自己的见解,新项目一般是不会用这种老掉牙的时间调度器了,但是维护老项目还是用的着的。就当笔记记录一下了,自己写的才是符合自己的思路走向的。有时间再补上Quartz调度器,这个才是现在使用最多的。

    二、常用的三种调度器分类

    Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。


    使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。


    Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。

    三、使用Spring体系来完成代码的搭建

    1、代码结构:

                                      

    2、springContext.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
           default-lazy-init="true">
    
        <!--定义了一个TimerFactoryBean类,并且把ScheduledTimerTask类的实例作为需要调度的task。-->
        <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean" lazy-init="false">
            <property name="scheduledTimerTasks">
                <list>
                    <ref local="scheduledTask1"/>
                    <ref local="scheduledTask2"/>
                </list>
            </property>
        </bean>
    
        <!--利用ScheduledTimerTask类来配置每个task的启动时间延时,每次启动之间的间隔,当然还有最重要的是需要运行那个对象,也就是MethodInvokingTimerTaskFactoryBean类的实例-->
        <bean id="scheduledTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask">
            <property name="delay" value="0" />
            <property name="period" value="1000" />
            <property name="timerTask">
                <ref bean="methodInvokingTask1"/>
            </property>
        </bean>
    
        <bean id="scheduledTask2" class="org.springframework.scheduling.timer.ScheduledTimerTask">
            <property name="delay" value="0" />
            <property name="period" value="1000" />
            <property name="timerTask">
                <ref bean="methodInvokingTask2"/>
            </property>
        </bean>
    
        <!--利用spring提供的MethodInvokingTimerTaskFactoryBean类来实现来实现对对task类和方法的声明,声明目标对象和方法,从而使spring知道要运行那个类的那个方法-->
        <bean id="methodInvokingTask1" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
            <property name="targetObject" ref="myTask1"/>
            <property name="targetMethod" value="run"/>
        </bean>
    
        <bean id="methodInvokingTask2" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
            <property name="targetObject" ref="myTask2"/>
            <property name="targetMethod" value="run"/>
        </bean>
    
        <!--被指定自动任务的类对象-->
        <bean id="myTask1" class="com.turtle.test.MyTask">
            <property name="name" value="启动一"/>
        </bean>
    
        <bean id="myTask2" class="com.turtle.test.MyTask_2">
            <property name="name" value="启动二"/>
        </bean>
    
    </beans>

    3、MyTask文件

    package com.turtle.test;
    
    import java.util.TimerTask;
    
    /**
     * 自定义一个定时任务
     * 推荐是继承自 TimerTask
     */
    public class MyTask extends TimerTask {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        private static int i = 0;
    
        // 使用线程中的方法  run
        @Override
        public void run() {
            System.out.println("定时任务启动"+name+"----出现了"+i++);
        }
    }

    4、MyTask_2文件

    package com.turtle.test;
    
    import java.util.TimerTask;
    
    /**
     * 自定义一个定时任务
     * 推荐是继承自 TimerTask
     */
    public class MyTask_2 extends TimerTask {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        private static int i = 0;
    
        // 使用线程中的方法  run
        @Override
        public void run() {
            System.out.println("定时任务启动"+name+"----出现了"+i++);
        }
    }

    5、MyTestTask_Test_01

    package com.turtle.test;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MyTestTask_Test_01 {
        public static void main(String[] args) {
            // 启动测试
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springContext.xml");
        }
    }

    6、结果:

                            

    四、总结:

    如果要使用TImer的调度器的话,推荐使用新的ScheduledExecutorService,这个目前没使用,就没进行代码验证了,推荐一博客,大概看了下,写得挺好的https://blog.csdn.net/wangmx1993328/article/details/80840598

  • 相关阅读:
    python中的 if __name__ == "__main__": 语句的作用
    python的打包与解包
    python循环删除列表元素
    python字典键值对新增与修改的几种方法及差异总结
    python列表元素删除的几种方法以及差异总结
    python之redis(二)
    python之redis(一)
    python之mysql(四)
    python之mysql(三)
    python之mysql(二)
  • 原文地址:https://www.cnblogs.com/zhh19981104/p/11850985.html
Copyright © 2011-2022 走看看