简单任务
使用 Spring Cloud 任务进行批处理
在本指南中,我们开发了一个使用 Spring Cloud Task 的 Spring Boot 应用程序并将其部署到 Cloud Foundry、Kubernetes 和您的本地计算机。在另一个指南中,我们使用 Data Flow部署任务应用程序。
以下部分描述了如何从头开始构建此应用程序。如果您愿意,您可以下载一个包含应用程序源代码(称为billsetup
)的 zip 文件,将其解压缩,然后继续进行部署步骤。
您可以从浏览器下载项目,也可以从命令行运行以下命令:
wget https://github.com/spring-cloud/spring-cloud-dataflow-samples/blob/master/dataflow-website/batch-developer-guides/batch/batchsamples/dist/batchsamples.zip?raw=true -O batchsamples.zip
开发
我们从Spring Initializr开始,创建一个 Spring Cloud Task 应用程序。
假设手机数据提供商需要为客户创建账单。使用数据存储在存储在文件系统上的 JSON 文件中。计费解决方案必须从这些文件中提取数据,从该使用数据生成计费数据,并将其存储在BILLING_STATEMENTS
表中。
对于此示例,我们将解决方案分为两个阶段:
billsetuptask
: 该billsetuptask
应用程序是一个使用 Spring Cloud Task 创建BILL_STATEMENTS
表的 Spring Boot 应用程序。billrun
:该billrun
应用程序是一个 Spring Boot 应用程序,它使用 Spring Cloud Task 和 Spring Batch 从 JSON 文件中读取每一行的使用数据和价格,并将结果数据放入BILL_STATEMENTS
表中。
对于本节,我们创建一个 Spring Cloud Task and Boot 应用程序,该应用程序创建BILL_STATEMENTS
BillRun 应用程序使用的表。下图显示了该BILL_STATEMENTS
表:
初始化
您可以[直接下载 Spring Initialzr 生成的项目,](https://start.spring.io/starter.zip?type=maven-project&language=java&baseDir=billsetuptask&groupId=io.spring&artifactId=billsetuptask&name=Bill Setup Task&description=Bill Setup Task Sample App&packageName=io.spring.billsetuptask&packaging=jar&dependencies=cloud-task&dependencies=h2&dependencies=mysql&dependencies=jdbc)也可以访问Spring Initializr 站点并按照以下说明进行操作:
- 访问Spring Initialzr 站点。
- 选择最新版本的 Spring Boot。
io.spring
使用 Group 名称和 Artifact 名称创建一个新的 Maven 项目billsetuptask
。- 在依赖项文本框中,键入
task
并选择 Cloud Task 依赖项。 - 在依赖项文本框中,键入
jdbc
并选择 JDBC 依赖项。 - 在依赖项文本框中,键入
h2
并选择 H2 依赖项。我们使用 H2 进行单元测试。 - 在Dependencies文本框中,键入
mysql
并选择 MySQL 依赖项(或您喜欢的数据库)。我们使用 MySQL 作为运行时数据库。 - 单击生成项目按钮。
现在您应该unzip
将billsetuptask.zip
文件导入到您喜欢的 IDE 中。
设置 MySql
如果您没有可用的 MySQL 实例,您可以按照以下说明运行此示例的 MySQL docker 映像:
-
通过运行以下命令拉取 MySQL docker 映像:
复制
docker pull mysql:5.7.25
-
通过运行以下命令启动 MySQL:
复制
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_DATABASE=task -d mysql:5.7.25
构建应用程序
现在我们可以创建此应用程序所需的代码。为此:
- 创建
io.spring.billsetuptask.configuration
包。 - 在
io.spring.billsetuptask.configuration
包中,创建一个TaskConfiguration
类似于以下清单的类:
复制
@Configuration
@EnableTask
public class TaskConfiguration {
@Autowired
private DataSource dataSource;
@Bean
public CommandLineRunner commandLineRunner() {
return args -> {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS " +
"BILL_STATEMENTS ( id int, " +
"first_name varchar(50), last_name varchar(50), " +
"minutes int,data_usage int, bill_amount double)");
};
}
}
该@EnableTask
注解设置了一个TaskRepository
,其中存储了有关任务执行的信息(例如任务的开始和结束时间以及退出代码)。
测试
现在我们可以创建我们的测试了。为此,请BillsetuptaskApplicationTests.java
使用以下代码更新 的内容:
package io.spring.billsetuptask;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
class BillSetupTaskApplicationTests {
@Autowired
private DataSource dataSource;
@Test
public void testRepository() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSource);
int result = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM BILL_STATEMENTS", Integer.class);
assertThat(result).isEqualTo(0);
}
}
在您的 IDE 中运行此测试。spring.datasource
由于未设置Spring Boot 的属性,因此测试针对嵌入式 H2 数据库运行。在下一步中,您可以部署应用程序并以 MySQL 数据库为目标。
本地部署
在本节中,我们将任务应用程序部署到本地机器、Cloud Foundry 和 Kubernetes。
现在我们可以构建项目了。为此:
-
在命令行中,将目录更改为项目的位置,并通过运行以下 Maven 命令构建项目:
./mvnw clean package
-
BILL_STATEMENTS
使用在 MySQL 数据库中创建表所需的配置运行应用程序。要配置billsetuptask
应用程序的运行方式,您可以使用以下参数:spring.datasource.url
:将 URL 设置为您的数据库实例。在以下示例中,我们通过task
端口 3306 连接到本地计算机上的 MySQL 数据库。spring.datasource.username
:用于 MySQL 数据库的用户名。在下面的示例中,它是root
.spring.datasource.password
:用于 MySQL 数据库的密码。在以下示例中。它是password
。spring.datasource.driverClassName
: 用于连接 MySQL 数据库的驱动程序。在下面的示例中,它是com.mysql.cj.jdbc.Driver
.
以下命令
billsetuptask
使用我们的数据库连接值运行应用程序:java -jar target/billsetuptask-0.0.1-SNAPSHOT.jar \ '--spring.datasource.url=jdbc:mysql://localhost:3306/task?useSSL=false' \ --spring.datasource.username=root \ --spring.datasource.password=password \ --spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
或者,您可以将这些属性放入
application.properties
并BillSetupTaskApplication
从您的 IDE 中运行。
查看数据库中的任务执行结果
Spring Cloud Task 将所有任务执行记录到一个名为TASK_EXECUTION
. 下面是 Spring Cloud Task 记录的一些信息:
START_TIME
: 任务执行开始的时间END_TIME
:任务执行完成的时间TASK_NAME
: 与任务执行相关的名称EXIT_CODE
:任务执行返回的退出码EXIT_MESSAGE
:为执行返回的退出消息ERROR_MESSAGE
:为执行返回的错误消息(如果有)EXTERNAL_EXECUTION_ID
: 与任务执行相关联的 ID
默认情况下,TASK_NAME
是application
.
您可以使用以下命令来查询TASK_EXECUTION
表:
复制
$ docker exec -it mysql bash -l
# mysql -u root -ppassword
mysql> select * from task.TASK_EXECUTION;
结果应类似于以下输出:
复制
| TASK_EXECUTION_ID | START_TIME | END_TIME | TASK_NAME | EXIT_CODE | EXIT_MESSAGE | ERROR_MESSAGE | LAST_UPDATED | EXTERNAL_EXECUTION_ID | PARENT_EXECUTION_ID |
|-------------------|---------------------|---------------------|-----------------|-----------|--------------|---------------|---------------------|-----------------------|---------------------|
| 1 | 2019-04-23 18:10:57 | 2019-04-23 18:10:57 | application | 0 | NULL | NULL | 2019-04-23 18:10:57 | NULL | NULL |
设置任务执行的应用程序名称
在上表中,该TASK_NAME
列的默认值为application
。Spring Cloud Task 允许我们使用spring.cloud.task.name
. 为此,我们将该属性添加到下一次运行中,如下所示:
复制
java -jar target/billsetuptask-0.0.1-SNAPSHOT.jar \
--spring.datasource.url=jdbc:mysql://localhost:3306/task?useSSL=false \
--spring.datasource.username=root \
--spring.datasource.password=password \
--spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver \
--spring.cloud.task.name=BillSetupTest1
现在,当您查询表时,您可以看到查询中运行的最后一个任务现在的名称为BillSetupTest1
.
清理
要停止和删除在 docker 实例中运行的 MySQL 容器,请运行以下命令:
复制
docker stop mysql
docker rm mysql
Kubernetes
本节介绍如何在 Kubernetes 上部署和运行一个简单的spring-cloud-task应用程序。
我们将billsetuptask示例应用程序部署到 Kubernetes。
设置 Kubernetes 集群
我们需要一个正在运行的Kubernetes 集群。对于此示例,我们部署到minikube
.
验证 Minikube 是否正在运行
要验证 Minikube 是否正在运行,请运行以下命令(显示其输出):
复制
$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100
安装数据库
您需要使用 Spring Cloud Data Flow 中的默认配置安装 MySQL 服务器。为此,请运行以下命令:
复制
kubectl apply -f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/v2.9.1/src/kubernetes/mysql/mysql-deployment.yaml \
-f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/v2.9.1/src/kubernetes/mysql/mysql-pvc.yaml \
-f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/v2.9.1/src/kubernetes/mysql/mysql-secrets.yaml \
-f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/v2.9.1/src/kubernetes/mysql/mysql-svc.yaml
构建 Docker 镜像
我们需要为billsetuptask
应用程序构建 docker 镜像。为此,我们使用jib Maven 插件。如果您下载了源代码分发版,则 jib 插件已配置。如果您从头开始构建应用程序,请在plugins
in下添加以下内容pom.xml
:
复制
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>0.10.1</version>
<configuration>
<from>
<image>springcloud/openjdk</image>
</from>
<to>
<image>${docker.org}/${project.artifactId}:${docker.version}</image>
</to>
<container>
<useCurrentTimestamp>true</useCurrentTimestamp>
</container>
</configuration>
</plugin>
然后将引用的属性添加到properties
. 对于此示例,我们使用以下属性:
复制
<docker.org>springcloudtask</docker.org>
<docker.version>${project.version}</docker.version>
现在您可以将映像添加到minikube
Docker 注册表。为此,请运行以下命令:
复制
eval $(minikube docker-env)
./mvnw clean package jib:dockerBuild
您可以运行以下命令来验证其存在(通过springcloudtask/billsetuptask
在结果图像列表中查找):
复制
docker images
Spring Cloud Data Flow 已经测试了由Spring Boot 的 gradle/maven 插件、jib maven 插件和docker build
命令创建的容器。
部署应用程序
部署任务应用程序的最简单方法是作为独立Pod。将任务部署为作业或CronJob被认为是生产环境的最佳实践,但超出了本指南的范围。
首先,将以下内容保存到task-app.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: billsetuptask
spec:
restartPolicy: Never
containers:
- name: task
image: springcloudtask/billsetuptask:0.0.1-SNAPSHOT
env:
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: mysql-root-password
- name: SPRING_DATASOURCE_URL
value: jdbc:mysql://mysql:3306/task
- name: SPRING_DATASOURCE_USERNAME
value: root
- name: SPRING_DATASOURCE_DRIVER_CLASS_NAME
value: com.mysql.cj.jdbc.Driver
initContainers:
- name: init-mysql-database
image: mysql:5.6
env:
- name: MYSQL_PWD
valueFrom:
secretKeyRef:
name: mysql
key: mysql-root-password
command:
[
'sh',
'-c',
'mysql -h mysql -u root -e "CREATE DATABASE IF NOT EXISTS task;"',
]
现在您可以通过运行以下命令来启动应用程序:
复制
kubectl apply -f task-app.yaml
任务完成后,您应该会看到类似于以下内容的输出:
复制
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-5cbb6c49f7-ntg2l 1/1 Running 0 4h
billsetuptask 0/1 Completed 0 81s
对结果满意后,可以删除 pod。为此,请运行以下命令:
复制
kubectl delete -f task-app.yaml
现在您可以检查数据库以查看运行应用程序的结果。为此,请登录到mysql
容器并查询TASK_EXECUTION
表。通过运行获取 MySQL pod 的名称kubectl get pods
,如前所示。然后需要登录,如下:
复制
$ kubectl exec -it mysql-5cbb6c49f7-ntg2l -- /bin/bash
# mysql -u root -p$MYSQL_ROOT_PASSWORD
mysql> select * from task.TASK_EXECUTION;
要卸载mysql
,请运行以下命令:
复制
kubectl delete all -l app=mysql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY