Getting started
如果您刚刚开始使用 Spring Cloud Task,您应该阅读本部分。在这里,我们将回答基本“what?”(“什么?”)、“how?”(“如何?”)、“why?”(“为什么?”)问题。我们将以一个 Spring Cloud Task 的温和介绍作为开场白。然后,我们构建一个 Spring Cloud Task 应用程序,在构建过程中讨论一些核心原则。
Developing Your First Spring Cloud Task Application
一个好的起点是使用一个简单的“Hello, World!”应用程序,因此我们创建 Spring Cloud Task 等价项来突出该框架的功能。大多数 IDE 都很好地支持 Apache Maven,因此我们将其用作此项目的构建工具。
|
spring.io 网站包含许多使用 Spring Boot 的 “ |
Creating the Spring Task Project using Spring Initializr
现在,我们可以创建一个应用程序并对其进行测试,该应用程序会将“Hello, World!”打印到控制台。
为此,请:
-
访问 Spring Initialzr网站。[style="loweralpha"]
-
使用
io.spring.demo的 Group 名称和helloworld的 Artifact 名称创建一个新的 Maven 项目。 -
在“Dependencies”文本框中,键入
task,然后选择带有Spring Cloud标签的Task依赖项。 -
在“Dependencies”文本框中,键入
h2,然后选择带有SQL标签的H2依赖项。 -
单击 Generate Project 按钮
-
-
解压 helloworld.zip 文件,并将项目导入到您喜欢的 IDE 中。
Writing the Code
要完成我们的应用程序,我们需要使用以下内容更新生成的 HelloworldApplication,以便它启动一个任务。
package io.spring.demo.helloworld;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.task.configuration.EnableTask;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableTask
public class HelloworldApplication {
@Bean
public ApplicationRunner applicationRunner() {
return new HelloWorldApplicationRunner();
}
public static void main(String[] args) {
SpringApplication.run(HelloworldApplication.class, args);
}
public static class HelloWorldApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("Hello, World!");
}
}
}
尽管看起来简单,但功能强大。有关 Spring Boot 详细信息,请参阅 Spring Boot reference documentation 。
现在,我们可以在 src/main/resources 中打开 application.properties 文件。我们需要在 application.properties 中配置两个属性:
-
application.name:设置应用程序名称(已翻译为任务名称) -
logging.level:为 Spring Cloud Task 设置日志记录为DEBUG以便了解正在发生的事情。
以下示例展示了如何同时执行这两项操作:
logging.level.org.springframework.cloud.task=DEBUG
spring.application.name=helloWorld
Task Auto Configuration
在包含 Spring Cloud Task Starter 依赖项时,任务会自动配置所有 bean 以引导其功能。此配置的部分内容会注册 TaskRepository 及其使用的基础设施。
在我们的演示中,TaskRepository 使用嵌入式 H2 数据库来记录任务的结果。此 H2 嵌入式数据库不是生产环境的实用解决方案,因为在任务结束后 H2 数据库就消失了。然而,为了快速入门,我们可以将此数据库用在我们的示例中,以及将正在更新的信息传递给日志。在 Configuration 小节(在本文档的后面部分),我们将介绍如何自定义 Spring Cloud 任务提供的组件配置。
当我们的示例应用程序运行时,Spring Boot 会启动 HelloWorldApplicationRunner 并将“Hello, World!” 输出到标准输出。TaskLifecycleListener 在仓库中记录任务的开始和结束。
The main method
主方法充当任何 Java 应用程序的入口点。我们的主方法委派给 Spring Boot 的 SpringApplication 类。
The ApplicationRunner
Spring 提供很多方法来引导应用程序逻辑。Spring Boot 通过其 *Runner 接口(CommandLineRunner 或 ApplicationRunner)提供了一种以有条理地执行该操作的便捷方法。一个行为良好的任务可以通过使用这两个 runner 中的一个来引导任何逻辑。
任务的生命周期被认为从 *Runner#run 方法执行前到所有方法都完成后这段时间内。正如 Spring Cloud Task 所做的那样,Spring Boot 让应用程序使用多个 *Runner 实现。
|
任何从 |
Running the Example
此时,我们的应用程序应能正常工作。由于该应用程序基于 Spring Boot,所以我们可以使用 $ ./mvnw spring-boot:run 从应用程序的根目录运行它,如下例所示(及其输出):
$ mvn clean spring-boot:run
....... . . .
....... . . . (Maven log output here)
....... . . .
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.1)
2024-01-04T10:07:01.102-06:00 INFO 18248 --- [helloWorld] [ main] i.s.d.helloworld.HelloworldApplication : Starting HelloworldApplication using Java 21.0.1 with PID 18248 (/Users/dashaun/fun/dashaun/spring-cloud-task/helloworld/target/classes started by dashaun in /Users/dashaun/fun/dashaun/spring-cloud-task/helloworld)
2024-01-04T10:07:01.103-06:00 INFO 18248 --- [helloWorld] [ main] i.s.d.helloworld.HelloworldApplication : No active profile set, falling back to 1 default profile: "default"
2024-01-04T10:07:01.526-06:00 INFO 18248 --- [helloWorld] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2024-01-04T10:07:01.626-06:00 INFO 18248 --- [helloWorld] [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:3ad913f8-59ce-4785-bf8e-d6335dff6856 user=SA
2024-01-04T10:07:01.627-06:00 INFO 18248 --- [helloWorld] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2024-01-04T10:07:01.633-06:00 DEBUG 18248 --- [helloWorld] [ main] o.s.c.t.c.SimpleTaskAutoConfiguration : Using org.springframework.cloud.task.configuration.DefaultTaskConfigurer TaskConfigurer
2024-01-04T10:07:01.633-06:00 DEBUG 18248 --- [helloWorld] [ main] o.s.c.t.c.DefaultTaskConfigurer : No EntityManager was found, using DataSourceTransactionManager
2024-01-04T10:07:01.639-06:00 DEBUG 18248 --- [helloWorld] [ main] o.s.c.t.r.s.TaskRepositoryInitializer : Initializing task schema for h2 database
2024-01-04T10:07:01.772-06:00 DEBUG 18248 --- [helloWorld] [ main] o.s.c.t.r.support.SimpleTaskRepository : Creating: TaskExecution{executionId=0, parentExecutionId=null, exitCode=null, taskName='helloWorld', startTime=2024-01-04T10:07:01.757268, endTime=null, exitMessage='null', externalExecutionId='null', errorMessage='null', arguments=[]}
2024-01-04T10:07:01.785-06:00 INFO 18248 --- [helloWorld] [ main] i.s.d.helloworld.HelloworldApplication : Started HelloworldApplication in 0.853 seconds (process running for 1.029)
Hello, World!
2024-01-04T10:07:01.794-06:00 DEBUG 18248 --- [helloWorld] [ main] o.s.c.t.r.support.SimpleTaskRepository : Updating: TaskExecution with executionId=1 with the following {exitCode=0, endTime=2024-01-04T10:07:01.787112, exitMessage='null', errorMessage='null'}
2024-01-04T10:07:01.799-06:00 INFO 18248 --- [helloWorld] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2024-01-04T10:07:01.806-06:00 INFO 18248 --- [helloWorld] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
....... . . .
....... . . . (Maven log output here)
....... . . .
前面的输出有我们关注的三行:
-
SimpleTaskRepository输出中记录了在TaskRepository中创建的条目。 -
我们的
ApplicationRunner的执行,通过 “Hello, World!” 输出演示。 -
SimpleTaskRepository输出TaskRepository中任务的完成情况。
|
可在 Spring Cloud Task 项目 here 的示例模块中找到一个简单的任务应用程序。 |