zoukankan      html  css  js  c++  java
  • 【译】Spring 4 基于TaskScheduler实现定时任务(注解)

    前言

    译文链接:http://websystique.com/spring/spring-job-scheduling-with-scheduled-enablescheduling-annotations/

    本文展示如何使用Spring的@Scheduled和@EnableScheduling注解来实现任务调度功能。

    涉及技术及开发工具

    • Spring 4.0.6.RELEASE
    • Maven 3
    • JDK 1.6
    • Eclipse JUNO Service Release 2

    工程目录结构

    步骤一:往pom.xml中添加依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
     
        <groupId>com.websystique.spring</groupId>
        <artifactId>SpringSchedulingAnnotationExample</artifactId>
        <version>1.0.0</version>
        <packaging>jar</packaging>
        <name>SpringSchedulingAnnotationExample</name>
     
        <properties>
            <springframework.version>4.0.6.RELEASE</springframework.version>
        </properties>
     
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${springframework.version}</version>
            </dependency>
        </dependencies>
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.2</version>
                        <configuration>
                            <source>1.6</source>
                            <target>1.6</target>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
     
    </project>

    步骤二:创建Spring配置类

    Spring配置类是指用@Configuration注解标注的类,这些类包含了用@Bean标注的方法。这些被@Bean标注的方法可以生成bean并交由spring容器管理。

    package com.websystique.spring.config;
     
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableScheduling;
     
    import com.websystique.spring.scheduling.MyBean;
     
    @Configuration
    @EnableScheduling
    public class AppConfig {
     
        @Bean
        public MyBean bean() {
            return new MyBean();
        }
     
    }

    这里要注意下@EnableScheduling注解,该注解开启了Spring的定时任务能力,使用该注解后,所有被@Scheduler标注的bean方法将会被注册用于调度

    如下是bean类:

    package com.websystique.spring.scheduling;
     
    import org.springframework.scheduling.annotation.Scheduled;
     
    public class MyBean {
     
        @Scheduled(fixedRate=5000)
        public void printMessage() {
            System.out.println("I am called by Spring scheduler");
        }
    }

    以上被@Scheduled标注的方法会每隔五秒调用一次;

    注意被@Scheduled标注的方法返回值是void且不能有参数,当然你可以注入其它bean,然后在printMessage方法内部实现其它额外功能。

    @Scheduled注解提供若干种属性配置用于指定不同的调度时间:

    initialDelay:在方法第一次执行之前等待的毫秒数;

    fixedRate:方法每次开始执行的毫秒间隔,与该方法什么时候执行结束无关;

    fixedDelay:上一次方法执行结束到下一次方法开始执行的毫秒间隔;

    cron:提供更加详细的控制,如@Scheduled(cron=*/5 * * * * MON-FRI")表示在工作日每隔五秒执行一次

    步骤三:创建main方法执行

    package com.websystique.spring;
     
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.support.AbstractApplicationContext;
     
    import com.websystique.spring.config.AppConfig;
     
    public class AppMain {
         
        @SuppressWarnings({ "unused", "resource" })
        public static void main(String args[]){
            AbstractApplicationContext  context = new AnnotationConfigApplicationContext(AppConfig.class);
        }
     
    }

    注意这里我们并没有显式的调用任何调度类或方法,仅仅简单的注册了我们的配置类;

    但是,由于我们使用了@EnableScheduling注解,被@Scheduler标注的bean方法会自动注册为计划任务去执行。

    运行以上程序,结果如下:

    I am called by Spring scheduler
    I am called by Spring scheduler
    I am called by Spring scheduler
    I am called by Spring scheduler
    I am called by Spring scheduler
    .....

    最后,假如你的任务需要花费很长的时间去完成,而且频率很高,你可以使用指定大小的线程池去处理各个方法中的任务,如下所示:

    package com.websystique.spring.config;
     
    import java.util.concurrent.Executor;
    import java.util.concurrent.Executors;
     
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
     
    import com.websystique.spring.scheduling.MyBean;
     
    @Configuration
    @EnableScheduling
    public class AppConfig implements SchedulingConfigurer {
     
        @Bean
        public MyBean bean() {
            return new MyBean();
        }
     
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            taskRegistrar.setScheduler(taskExecutor());
        }
     
        @Bean(destroyMethod="shutdown")
        public Executor taskExecutor() {
            return Executors.newScheduledThreadPool(10);
        }
     
    }

    以上配置使用的线程池大小为10,运行以上程序,可以得到相同的结果。

    工程源码

    http://websystique.com/?smd_process_download=1&download_id=811

  • 相关阅读:
    每日一题 为了工作 2020 0412 第四十一题
    每日一题 为了工作 2020 04011 第四十题
    每日一题 为了工作 2020 0410 第三十九题
    每日一题 为了工作 2020 0409 第三十八题
    每日一题 为了工作 2020 0408 第三十七题
    每日一题 为了工作 2020 0407 第三十六题
    每日一题 为了工作 2020 0406 第三十五题
    每日一题 为了工作 2020 0405 第三十四题
    学习总结(二十四)
    学习总结(二十三)
  • 原文地址:https://www.cnblogs.com/chenpi/p/6222220.html
Copyright © 2011-2022 走看看