快速开始
如果你刚开始接触 Spring Cloud Task,你应该阅读这一部分。 在这里,我们回答基本的“是什么?”、“怎么做?”和“为什么?”问题。我们从对 Spring Cloud Task 的 gentle 引入开始。然后构建一个 Spring Cloud Task 应用程序,在过程中讨论一些核心原理。
4. 引入 Spring Cloud Task
Spring Cloud Task 使创建短生命周期微服务变得容易。它提供 使短生命周期的 JVM 进程能够在生产环境中按需执行的 能力。
5.系统要求
您需要安装Java(Java 8及以上)。构建时还需要安装Maven
5.1. 数据库需求
Spring Cloud Task 使用关系型数据库来存储任务执行的结果。 虽然可以开始开发一个任务而不使用数据库(任务的状态会作为任务仓库更新的一部分被记录),但在生产环境中,你希望使用受支持的数据库。Spring Cloud Task 目前支持以下数据库:
-
DB2
-
H2
-
HSQLDB
-
MySQL
-
Oracle
-
Postgres
-
SQL Server
6. 开发您的第一个 Spring Cloud Task 应用程序
一个好的起点是从一个简单的“Hello, World!”应用程序开始,所以我们创建Spring Cloud Task的等价物来突出该框架的功能。大多数IDE对Apache Maven都有很好的支持,因此我们将其作为该项目的构建工具使用。
spring.io 网站包含许多 “Getting Started" 的 guides,它们使用 Spring Boot。如果你需要解决特定问题,先去那里检查。
你可以通过前往 Spring Initializr 并创建一个新的项目来跳过以下步骤。这样做会自动生成一个新的项目结构,让你可以立即开始编码。
我们建议通过实验 Spring Initializr 来熟悉它。 |
6.1. 使用 Spring Initializr 创建 Spring 任务项目
现在我们可以创建并测试一个打印 Hello, World! 到控制台的应用程序。
要做到这一点:
-
访问 Spring Initialzr 网站。
-
创建一个新的 Maven 项目,其 Group 名称设为
io.spring.demo,Artifact 名称设为helloworld。 -
在依赖项文本框中输入
task,然后选择Cloud Task个依赖项。 -
在依赖项文本框中输入
jdbc,然后选择JDBC个依赖项。 -
在依赖项文本框中输入
h2,然后选择H2。(或您喜欢的数据库) -
点击 生成项目 按钮
-
-
解压 helloworld.zip 文件,并将项目导入到您喜欢的 IDE 中。
6.2. 编写代码
为了完成我们的应用程序,我们需要将生成的 HelloworldApplication 更新为以下内容,以便启动一个 Task。
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 Boot 的更多具体信息,请参见 Spring Boot 参考文档。
现在我们可以打开 application.properties 文件在 src/main/resources。
我们需要在 application.properties 中配置两个属性:
-
application.name: 以应用程序名称设置(将应用程序名称翻译为任务名称) -
logging.level: 为了将 Spring Cloud Task 的日志设置为DEBUG以便 查看正在进行的操作。
以下示例展示了如何同时进行这两项操作:
logging.level.org.springframework.cloud.task=DEBUG
spring.application.name=helloWorld
6.2.1. 任务自动配置
When including Spring Cloud Task Starter dependency, Task auto configures all beans to bootstrap it’s functionality.
Part of this configuration registers the TaskRepository and the infrastructure for its use.
在我们的示例中,TaskRepository 使用嵌入式的 H2 数据库来记录任务的结果。这个嵌入式的 H2 数据库并非适用于生产环境,因为 H2 数据库在任务结束时就会消失。然而,为了快速入门体验,我们也可以在示例中使用它,并记录对该仓库进行的更新日志。在 配置 部分(本文档的后面部分),我们将介绍如何自定义 Spring Cloud Task 提供组件的配置。
当我们的示例应用程序运行时,Spring Boot 会启动 HelloWorldCommandLineRunner
并输出我们的 “Hello, World!” 消息到标准输出。TaskLifecycleListener
会记录任务的开始和结束,并在仓库中记录。
6.2.2. 主方法
主要方法是任何 Java 应用程序的入口点。我们的 main 方法 委托给 Spring Boot 的 SpringApplication 类。
6.2.3. CommandLineRunner
Spring 包含许多启动应用程序逻辑的方式。Spring Boot 通过其 *Runner 接口
(CommandLineRunner 或 ApplicationRunner) 提供了一种有组织地进行的便捷方法。一个行为良好的任务可以通过使用这两个运行器中的任何一个来启动任何逻辑。
任务的生命周期从在执行*Runner#run方法之前考虑,到所有方法都完成后为止。Spring Boot 让应用程序可以使用多个*Runner实现,Spring Cloud Task 也是如此。
任何不由 CommandLineRunner 或 ApplicationRunner 启动(例如使用 InitializingBean#afterPropertiesSet)的处理机制,Spring Cloud Task 均不会记录。 |
6.3. 运行示例
在这个阶段,我们的应用程序应该可以正常工作。由于这个应用程序是基于Spring Boot的,
我们可以从应用程序根目录使用$ mvn spring-boot:run从命令行运行,如下面示例中所示(并包含其输出):
$ 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'}
前面的输出包含三个我们在此处感兴趣的行:
-
SimpleTaskRepository登记了在TaskRepository中创建条目的操作。 -
我们的
CommandLineRunner的执行,通过“Hello, World!” 输出来演示。 -
SimpleTaskRepository在TaskRepository中记录了任务完成。
| 一个简单的任务应用程序可以在 Spring Cloud Task 项目中的 samples 模块找到 这里。 |