2. 开始使用

如果您刚刚开始使用 Spring Cloud Task,则应阅读本节。 在这里,我们回答了基本的 “what?”、“how?” 和 “why?” 问题。我们从 Spring Cloud Task 的简要介绍。然后,我们构建一个 Spring Cloud Task 应用程序 边走边讨论一些核心原则。spring-doc.cn

2.1. Spring Cloud Task 简介

Spring Cloud Task 使创建短期微服务变得容易。它提供 允许在生产中按需执行短期 JVM 进程的功能 环境。spring-doc.cn

2.2. 系统要求

您需要安装 Java(Java 8 或更高版本)。要构建,您需要拥有 Maven 也安装了。spring-doc.cn

2.2.1. 数据库要求

Spring Cloud Task 使用关系数据库来存储已执行任务的结果。 虽然您可以在没有数据库的情况下开始开发任务(任务的状态会记录下来 作为任务存储库更新的一部分),对于生产环境,您希望 使用支持的数据库。Spring Cloud Task 目前支持以下数据库:spring-doc.cn

2.3. 开发您的第一个 Spring Cloud Task 应用程序

一个好的起点是一个简单的 “Hello, World!” 应用程序,因此我们创建 Spring Cloud Task 等效于突出框架的功能。大多数 IDE 都有 对 Apache Maven 的良好支持,因此我们将其用作此项目的构建工具。spring-doc.cn

spring.io 网站包含许多入门” 使用 Spring Boot 的指南。如果您需要解决特定问题,请先检查那里。 您可以通过转到 Spring Initializr 并创建一个新项目来简化以下步骤。这样做 自动生成新的项目结构,以便您可以立即开始编码。 我们建议尝试使用 Spring Initializr 来熟悉它。

2.3.1. 使用 Spring Initializr 创建 Spring 任务项目

现在,我们可以创建并测试打印到控制台的应用程序。Hello, World!spring-doc.cn

为此,请执行以下操作:spring-doc.cn

  1. 访问 Spring Initialzr 网站。spring-doc.cn

    1. 创建一个 Group name 为 和 Artifact name 的新 Maven 项目。io.spring.demohelloworldspring-doc.cn

    2. 在 Dependencies (依赖项) 文本框中,键入并选择依赖项。taskCloud Taskspring-doc.cn

    3. 在 Dependencies (依赖项) 文本框中,键入并选择依赖项。jdbcJDBCspring-doc.cn

    4. 在 Dependencies (依赖项) 文本框中,键入并选择 .(或您最喜欢的数据库)h2H2spring-doc.cn

    5. 单击 Generate Project 按钮spring-doc.cn

  2. 解压缩 helloworld.zip 文件并将项目导入到您最喜欢的 IDE 中。spring-doc.cn

2.3.2. 编写代码

要完成我们的应用程序,我们需要使用以下内容更新生成的应用程序,以便它启动一个 Task。HelloworldApplicationspring-doc.cn

package io.spring.demo.helloworld;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableTask
public class HelloworldApplication {

    @Bean
    public CommandLineRunner commandLineRunner() {
        return new HelloWorldCommandLineRunner();
    }

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

    public static class HelloWorldCommandLineRunner implements CommandLineRunner {

        @Override
        public void run(String... strings) throws Exception {
            System.out.println("Hello, World!");
        }
    }
}

虽然它可能看起来很小,但正在发生相当多的事情。有关 Spring 的更多信息 引导细节,请参阅 Spring Boot 参考文档spring-doc.cn

现在我们可以在 中打开文件。 我们需要在 中配置两个属性:application.propertiessrc/main/resourcesapplication.propertiesspring-doc.cn

  • application.name:设置应用程序名称(转换为任务名称)spring-doc.cn

  • logging.level:要将 Spring Cloud 任务的日志记录设置为 了解正在发生的事情。DEBUGspring-doc.cn

以下示例显示了如何执行这两项操作:spring-doc.cn

logging.level.org.springframework.cloud.task=DEBUG
spring.application.name=helloWorld
任务自动配置

当包含 Spring Cloud Task Starter 依赖项时,Task auto 会配置所有 bean 以引导其功能。 此配置的一部分注册 和 基础结构以供其使用。TaskRepositoryspring-doc.cn

在我们的演示中,使用嵌入式 H2 数据库来记录结果 的任务。此 H2 嵌入式数据库不是生产环境的实用解决方案,因为 任务结束后,H2 DB 就会消失。但是,为了快速入门 经验,我们可以在示例中使用它,并将正在更新的内容回显到日志中 在那个存储库中。在 Configuration (配置) 部分(稍后部分) 文档),我们将介绍如何自定义 Spring Cloud 任务。TaskRepositoryspring-doc.cn

当我们的示例应用程序运行时,Spring Boot 会启动我们的 “Hello, World!” 消息并输出到 standard out。在存储库中记录任务的开始和结束。HelloWorldCommandLineRunnerTaskLifecycleListenerspring-doc.cn

main 方法

main 方法用作任何 Java 应用程序的入口点。我们的主要方法 委托给 Spring Boot 的 SpringApplication 类。spring-doc.cn

The CommandLineRunner

Spring 包含许多方法来引导应用程序的 logic。Spring Boot 提供 一种通过其接口以有组织的方式执行此操作的便捷方法 ( 或 )。一个表现良好的任务可以引导任何 logic 使用这两个 runner 之一。*RunnerCommandLineRunnerApplicationRunnerspring-doc.cn

任务的生命周期从执行方法之前开始考虑 到它们全部完成之后。Spring Boot 允许应用程序使用多个实现,Spring Cloud Task 也是如此。*Runner#run*Runnerspring-doc.cn

从 或 (通过使用,例如) 以外的机制引导的任何处理都不是 由 Spring Cloud Task 记录。CommandLineRunnerApplicationRunnerInitializingBean#afterPropertiesSet

2.3.3. 运行示例

此时,我们的应用程序应该可以正常工作。由于此应用程序基于 Spring Boot,因此 我们可以使用 from the root 从命令行运行它 ,如以下示例中所示(及其输出):$ mvn spring-boot:runspring-doc.cn

$ mvn clean spring-boot:run
....... . . .
....... . . . (Maven log output here)
....... . . .

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.3.RELEASE)

2018-07-23 17:44:34.426  INFO 1978 --- [           main] i.s.d.helloworld.HelloworldApplication   : Starting HelloworldApplication on Glenns-MBP-2.attlocal.net with PID 1978 (/Users/glennrenfro/project/helloworld/target/classes started by glennrenfro in /Users/glennrenfro/project/helloworld)
2018-07-23 17:44:34.430  INFO 1978 --- [           main] i.s.d.helloworld.HelloworldApplication   : No active profile set, falling back to default profiles: default
2018-07-23 17:44:34.472  INFO 1978 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1d24f32d: startup date [Mon Jul 23 17:44:34 EDT 2018]; root of context hierarchy
2018-07-23 17:44:35.280  INFO 1978 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2018-07-23 17:44:35.410  INFO 1978 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2018-07-23 17:44:35.419 DEBUG 1978 --- [           main] o.s.c.t.c.SimpleTaskConfiguration        : Using org.springframework.cloud.task.configuration.DefaultTaskConfigurer TaskConfigurer
2018-07-23 17:44:35.420 DEBUG 1978 --- [           main] o.s.c.t.c.DefaultTaskConfigurer          : No EntityManager was found, using DataSourceTransactionManager
2018-07-23 17:44:35.522 DEBUG 1978 --- [           main] o.s.c.t.r.s.TaskRepositoryInitializer    : Initializing task schema for h2 database
2018-07-23 17:44:35.525  INFO 1978 --- [           main] o.s.jdbc.datasource.init.ScriptUtils     : Executing SQL script from class path resource [org/springframework/cloud/task/schema-h2.sql]
2018-07-23 17:44:35.558  INFO 1978 --- [           main] o.s.jdbc.datasource.init.ScriptUtils     : Executed SQL script from class path resource [org/springframework/cloud/task/schema-h2.sql] in 33 ms.
2018-07-23 17:44:35.728  INFO 1978 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-07-23 17:44:35.730  INFO 1978 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Bean with name 'dataSource' has been autodetected for JMX exposure
2018-07-23 17:44:35.733  INFO 1978 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2018-07-23 17:44:35.738  INFO 1978 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0
2018-07-23 17:44:35.762 DEBUG 1978 --- [           main] o.s.c.t.r.support.SimpleTaskRepository   : Creating: TaskExecution{executionId=0, parentExecutionId=null, exitCode=null, taskName='application', startTime=Mon Jul 23 17:44:35 EDT 2018, endTime=null, exitMessage='null', externalExecutionId='null', errorMessage='null', arguments=[]}
2018-07-23 17:44:35.772  INFO 1978 --- [           main] i.s.d.helloworld.HelloworldApplication   : Started HelloworldApplication in 1.625 seconds (JVM running for 4.764)
Hello, World!
2018-07-23 17:44:35.782 DEBUG 1978 --- [           main] o.s.c.t.r.support.SimpleTaskRepository   : Updating: TaskExecution with executionId=1 with the following {exitCode=0, endTime=Mon Jul 23 17:44:35 EDT 2018, exitMessage='null', errorMessage='null'}

前面的输出有三行我们在这里感兴趣:spring-doc.cn

  • SimpleTaskRepository在 中记录了条目的创建。TaskRepositoryspring-doc.cn

  • 我们的 , 的执行由 “Hello, World!” 输出演示。CommandLineRunnerspring-doc.cn

  • SimpleTaskRepository在 中记录任务的完成情况。TaskRepositoryspring-doc.cn

可以在 Spring Cloud 的 samples 模块中找到一个简单的任务应用程序 任务项目在这里