此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 spring-cloud-task 3.1.3! |
开始
如果您刚刚开始使用 Spring Cloud Task,则应阅读本节。 在这里,我们回答了基本的 “what?”、“how?” 和 “why?” 问题。我们从 Spring Cloud Task 的简要介绍。然后,我们构建一个 Spring Cloud Task 应用程序 边走边讨论一些核心原则。
开发您的第一个 Spring Cloud 任务应用程序
一个好的起点是一个简单的 “Hello, World!” 应用程序,因此我们创建 Spring Cloud Task 等效于突出框架的功能。大多数 IDE 都有 对 Apache Maven 的良好支持,因此我们将其用作此项目的构建工具。
spring.io 网站包含许多“Getting Started ”
指南使用 Spring Boot 的 Boot。如果您需要解决特定问题,请先检查那里。
您可以通过转到 Spring Initializr 并创建一个新项目来简化以下步骤。这样做
自动生成新的项目结构,以便您可以立即开始编码。
我们建议尝试使用 Spring Initializr 来熟悉它。 |
使用 Spring Initializr 创建 Spring 任务项目
现在,我们可以创建并测试一个打印Hello, World!
拖动到控制台。
为此,请执行以下作:
-
访问 Spring Initialzr 网站。
-
创建一个 Group name 为
io.spring.demo
和 Artifact 名称helloworld
. -
在 Dependencies (依赖项) 文本框中,键入
task
,然后选择Task
依赖项替换为Spring Cloud
标签。 -
在 Dependencies (依赖项) 文本框中,键入
h2
,然后选择H2
依赖项替换为SQL
标签。 -
单击 Generate Project 按钮
-
-
解压缩 helloworld.zip 文件并将项目导入到您最喜欢的 IDE 中。
编写代码
要完成我们的应用程序,我们需要更新生成的HelloworldApplication
替换为以下内容,以便启动 Task。
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 的更多信息 引导细节,请参阅 Spring Boot 参考文档。
现在我们可以打开application.properties
文件src/main/resources
.
我们需要在application.properties
:
-
application.name
:设置应用程序名称(转换为任务名称) -
logging.level
:要将 Spring Cloud 任务的日志记录设置为DEBUG
为了 了解正在发生的事情。
以下示例显示了如何执行这两项作:
logging.level.org.springframework.cloud.task=DEBUG
spring.application.name=helloWorld
任务自动配置
当包含 Spring Cloud Task Starter 依赖项时,Task auto 会配置所有 bean 以引导其功能。
此配置的一部分会注册TaskRepository
以及使用它的基础设施。
在我们的演示中,TaskRepository
使用嵌入式 H2 数据库记录结果
的任务。此 H2 嵌入式数据库不是生产环境的实用解决方案,因为
任务结束后,H2 DB 就会消失。但是,为了快速入门
经验,我们可以在示例中使用它,并将正在更新的内容回显到日志中
在那个存储库中。在 Configuration (配置) 部分(稍后部分)
文档),我们将介绍如何自定义
Spring Cloud 任务。
当我们的示例应用程序运行时, Spring Boot 会启动我们的HelloWorldApplicationRunner
并将我们的 “Hello, World!” 消息输出到 standard out。这TaskLifecycleListener
在存储库中记录任务的开始和结束。
main 方法
main 方法用作任何 Java 应用程序的入口点。我们的主要方法 委托给 Spring Boot 的 SpringApplication 类。
ApplicationRunner 的
Spring 包含许多方法来引导应用程序的 logic。Spring Boot 提供
一种通过其*Runner
接口
(CommandLineRunner
或ApplicationRunner
).一个表现良好的任务可以引导任何
logic 使用这两个 runner 之一。
任务的生命周期被视为从*Runner#run
方法被执行
到它们全部完成之后。Spring Boot 允许应用程序使用多个*Runner
实现,Spring Cloud Task 也是如此。
从CommandLineRunner 或ApplicationRunner (通过使用InitializingBean#afterPropertiesSet 例如)不是
由 Spring Cloud Task 记录。 |
运行示例
此时,我们的应用程序应该可以正常工作。由于此应用程序基于 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 的 samples 模块中找到一个简单的任务应用程序 任务项目在这里。 |