定时任务

定时任务

入门Spring定时任务

编写内容

你会使用Spring的@Scheduled注解编写一个每5秒打印当前时间的应用

需要准备的东西

  • 大概15分钟
  • 一个文本编辑器或者IDE
  • JDK 1.8 以上
  • Gradle 4+ 或者 Maven 3.2+
  • 也可以直接将代码导入到你的IDE
    • Spring Tool Suite
    • Intellij IDEA

如何完成

可以一步一步跟着做

也可以直接跳过基础,如下:

  • 下载并解压源仓库,或者通过git克隆:git clone https://github.com/spring-guides/gs-scheduling-tasks.git
  • 打开 gs-scheduling-tasks/initial
  • 直接跳到创建定时任务

通过Maven构建项目

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>

    <groupId>org.springframeworkgroupId>
    <artifactId>gs-scheduling-tasksartifactId>
    <version>0.1.0version>

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.2.1.RELEASEversion>
    parent>

    <properties>
        <java.version>1.8java.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starterartifactId>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

Spring Boot Maven plugin 提供了很多便捷的特性:

  • 它收集了所有在classpath下的jar包并且构建了一个简单的可执行的包:“über-jar”,这可以十分便捷地去执行和传输你的服务
  • 它通过寻找public static void main()方法来确认执行类
  • 它提供了一个内置的依赖解决器来设置版本号来匹配Spring Boot dependencies. 你也可以重写你想要的版本,但是默认是Boot设置的版本。

创建一个定时任务

/*
 * Copyright 2012-2015 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package hello;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

  private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

  private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

  @Scheduled(fixedRate = 5000)
  public void reportCurrentTime() {
    log.info("The time is now {}", dateFormat.format(new Date()));
  }
}

scheduled注解定义了特定的运行方式。NOTE:这个例子里面用了fixedrate,指定了两次方法调用的启动时刻之间的时间间隔。还有其他的选项,比如说fixedDelay制定了两次任务完成时刻的间隔。你可以使用@Scheduled(cron="...")表达式来实现更复杂的定时任务。

启动定时

尽管定时任务可以嵌入到一个web apps 或者WAR包中,一下介绍最简单的创建单机应用的方式。你可以通过制定Java的main()方法将所有的东西打包到一个可执行的Jar包中,这种方式传统且精妙。

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class);
  }
}

@SpringBootApplication是一个包含了以下所有注解的便捷的注解:

  • @Configuration:将该类标记为应用程序上下文的bean定义源。
  • @EnableAutoConfiguration:告诉Spring Boot根据类路径设置、其他bean和各种属性设置开始添加bean。例如,如果spring-webmvc位于类路径上,则该注释将应用程序标记为web应用程序并激活关键行为,例如设置DispatcherServlet。
  • @ComponentScan:告诉Spring在hello包中查找其他组件、配置和服务,让它查找控制器。

main()方法调用了Spring Boot的SpringApplication.run()方法来启动一个应用。你注意到了没有xml文件了吗,连web.xml都没有,这个web程序是100%Java的。你不需要去处理任何跟配置有关的基础构造。

@EnableScheduling确保后台任务执行器被创建,如果没有它的话,没有定时任务会启动。

启动程序

  • 直接启动Intellij即可

  • 如果你正在使用maven,可以通过./mvnw spring-boot:run来启动。也可以先构建Jar包:./mvnw clean package,然后通过以下的命令运行jar包:

java -jar target/gs-scheduling-tasks-0.1.0.jar

如果观察到以下日志信息,说明你已经成功了。

[...]
2016-08-25 13:10:00.143  INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:00
2016-08-25 13:10:05.143  INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:05
2016-08-25 13:10:10.143  INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:10
2016-08-25 13:10:15.143  INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:15

总结

恭喜,你已经创建了一个包含定时任务的应用。实际的代码要比build文件还要短!这种技术可以应用到任何类型的应用中。

你可能感兴趣的:(学习,spring,boot,java,maven)