调试批处理应用程序

应用程序应该可以作为标准 Java JAR 运行,并使用 java -jar 调用。所有依赖项(例如数据库和消息中间件)都应该可用,并手动测试连接问题。运行和调试应用程序独立于使用 SCDF 进行部署并在平台上运行。

项目构建错误

下图展示了如何处理项目构建错误

Yes
No
Errors in IDE
Run using Maven CLI
Success?
Fix IDE errors
Fix code errors

在 IDE 中修复错误取决于您使用的 IDE。验证构建在 IDE 之外是否成功有助于排除特定于项目的问题。

应用程序启动异常

下图展示了如何处理应用程序启动异常

Yes
Yes
No
Application Exceptions
Review stacktrace
General Coding Errors
Fix Code
Connection Exceptions
Valid configuration?
Test manually & apply any changes
Fix settings

应用程序启动时,可能会由于一般的编码错误或连接问题而发生异常。查看应用程序日志文件以查找异常并进行修复。确保所有外部服务均可访问,提供了正确的凭据,并且所有其他必需的信息均存在且正确。

一般应用程序调试

下图展示了如何处理一般应用程序调试

Review stacktrace
Enable JDWP for debugging
Enable Spring Integration debug logging

应用程序可以作为普通的 Java 进程进行调试,也可以通过将日志记录级别设置为 DEBUG 来使用详细的日志输出来进行调试。

要使用调试器调试应用程序,请在启动应用程序时添加以下 JVM 参数

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

通过添加此参数,您的应用程序将在端口 5005 上等待调试器连接以开始调试。这可以是您选择的任何未使用的端口。

启用 DEBUG 级别的日志记录也是一种有用的辅助方法。Spring Batch (org.springframework.batch) 和 Spring Cloud Task (logging.level.org.springframework.cloud.task) 中有两个相关的包。要启用批处理包的调试日志记录,请在启动应用程序时添加以下 JVM 参数

-Dlogging.level.org.springframework.batch=debug

要启用任务包的调试日志记录,请在启动应用程序时添加以下 JVM 参数

-Dlogging.level.org.springframework.cloud.task=debug

任务执行未记录到数据库

下图显示了如何处理未记录到数据库的任务执行

Yes
No
Task Execution not recorded
Verify Database is Accessible
Verify that database dependencies are present in pom.xml
EnableTask Annotated?
Enable Task logging
Add EnableTask annotation
Rerun Task and review logs

任务应用程序将执行信息记录到数据库。如果未发生这种情况,请确保存在正确的类级别注释 @EnableTask。此外,请验证 pom.xmlbuild.gradle 文件中是否存在正确的数据库依赖关系。最后,验证数据库连接属性是否已正确配置。

作业运行失败

下图显示了如何处理作业运行失败

Yes
No
Yes
NO
Job Failed To Execute
Verify Database is Accessible
Verify that database dependencies are present
EnableBatchProcessing Annotated?
Job already run successfully?
Add EnableBatchProcessing annotation
Rerun app with new parameters
Enable Batch logging
Rerun Batch and review logs

Spring Batch 要求应用程序能够访问数据库,并且存在 @EnableBatchProcessing

用户提出的一个常见问题是,在已成功启动批处理应用程序后再次启动它,但没有重新运行 Job。这是因为默认情况下,批处理应用程序是可重启的。因此,如果批处理 Job 在执行过程中失败,则可以重新启动它,并在下次执行时从失败的步骤开始继续执行。每个批处理 Job 实例都是唯一的。因此,如果要启动另一个 Job 实例,则需要更新其中一个 Job 参数(其中一个命令行参数)。或者,在代码中构建 Job 时,可以建立 Job 增量器

平台

本节介绍如何解决特定平台上的问题

  • Cloud Foundry
  • Kubernetes

Cloud Foundry

下图显示了如何处理 Cloud Foundry 上的错误

No
Yes
Yes
No
Verify Manifest
Verify environment variables
Services to bind created?
Errors in application log files?
Resolve exceptions
Enable SI logging for appropriate channels

如果应用程序在本地运行但在部署到 Cloud Foundry 时失败,请首先检查部署清单(manifest.yml)是否正确。这包括必须设置的所有环境变量、要绑定到的服务以及是否创建了这些服务。检查应用程序启动日志中是否有任何异常需要解决。

Kubernetes

下图展示了如何在 Kubernetes 上处理错误

No
Yes
No
Yes
No
Yes
Yes
Verify Deployment files
Verify environment variables
External services accessible?
Pod in RUNNING state?
kubectl describe POD_NAME
Errors in event table?
Resolve errors
kubectl logs POD_NAME
Application exceptions?
Resolve errors

如果在本地运行的应用程序部署到 Kubernetes 时失败,请先检查部署文件的正确性。这包括必须设置的任何环境变量、定义服务连接的属性,以及这些服务是否可用。描述应用程序 Pod 的事件表,以查看创建 Pod 时出现的问题,例如镜像拉取原因、健康检查失败等。检查应用程序启动日志中是否有任何异常需要解决。

容器

下图展示了如何处理容器错误

No
Yes
Yes
No
Yes
No
Create Container
Launch Container using 'docker run' with env variables and args
Successful?
Update container creation
Launch Container using 'docker run'
Create K8s pod spec yaml for container
Apply pod spec yaml in K8s instance
Successful?
Problem Resolved
Update Pod Spec Yaml
Success
Open Git Issue for Data Flow

如前所述,应用程序可能在本地平台上按预期运行,但在从 Spring Cloud Data Flow 启动时仍然失败。这可能是因为创建容器的工具(DockerFile、Spring Boot 容器插件、Jib 等)创建容器的方式所致。上图展示了如何排查应用程序因容器相关问题而无法启动的原因。

Data Flow 使用通用应用程序属性Spring Boot 通用标签将通用指标标签应用于所有已部署的Task应用程序。这些属性通常使用Spring 占位符来解析它们的值,例如:management.metrics.tags.application=${task.name:unknown}-${task.execution.id:unknown}。某些镜像容器可能无法正确解析此内容并将嵌入的属性替换为空字符串,这可能会导致任务应用程序失败。如果您没有使用指标,则可以通过将spring.cloud.dataflow.applicationProperties.taskResource设置为不存在的文件来禁用这些字段,例如:spring.cloud.dataflow.applicationProperties.taskResource=classpath:fake.yml