调试批处理应用程序
应用程序应该可以作为标准 Java JAR 运行,并使用 java -jar
调用。所有依赖项(例如数据库和消息中间件)都应该可用,并手动测试连接问题。运行和调试应用程序独立于使用 SCDF 进行部署并在平台上运行。
项目构建错误
下图展示了如何处理项目构建错误
在 IDE 中修复错误取决于您使用的 IDE。验证构建在 IDE 之外是否成功有助于排除特定于项目的问题。
应用程序启动异常
下图展示了如何处理应用程序启动异常
应用程序启动时,可能会由于一般的编码错误或连接问题而发生异常。查看应用程序日志文件以查找异常并进行修复。确保所有外部服务均可访问,提供了正确的凭据,并且所有其他必需的信息均存在且正确。
一般应用程序调试
下图展示了如何处理一般应用程序调试
应用程序可以作为普通的 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
任务执行未记录到数据库
下图显示了如何处理未记录到数据库的任务执行
任务应用程序将执行信息记录到数据库。如果未发生这种情况,请确保存在正确的类级别注释 @EnableTask
。此外,请验证 pom.xml
或 build.gradle
文件中是否存在正确的数据库依赖关系。最后,验证数据库连接属性是否已正确配置。
作业运行失败
下图显示了如何处理作业运行失败
Spring Batch 要求应用程序能够访问数据库,并且存在 @EnableBatchProcessing
。
用户提出的一个常见问题是,在已成功启动批处理应用程序后再次启动它,但没有重新运行 Job
。这是因为默认情况下,批处理应用程序是可重启的。因此,如果批处理 Job
在执行过程中失败,则可以重新启动它,并在下次执行时从失败的步骤开始继续执行。每个批处理 Job
实例都是唯一的。因此,如果要启动另一个 Job
实例,则需要更新其中一个 Job
参数(其中一个命令行参数)。或者,在代码中构建 Job
时,可以建立 Job
增量器。
平台
本节介绍如何解决特定平台上的问题
- Cloud Foundry
- Kubernetes
Cloud Foundry
下图显示了如何处理 Cloud Foundry 上的错误
如果应用程序在本地运行但在部署到 Cloud Foundry 时失败,请首先检查部署清单(manifest.yml
)是否正确。这包括必须设置的所有环境变量、要绑定到的服务以及是否创建了这些服务。检查应用程序启动日志中是否有任何异常需要解决。
Kubernetes
下图展示了如何在 Kubernetes 上处理错误
如果在本地运行的应用程序部署到 Kubernetes 时失败,请先检查部署文件的正确性。这包括必须设置的任何环境变量、定义服务连接的属性,以及这些服务是否可用。描述应用程序 Pod 的事件表,以查看创建 Pod 时出现的问题,例如镜像拉取原因、健康检查失败等。检查应用程序启动日志中是否有任何异常需要解决。
容器
下图展示了如何处理容器错误
如前所述,应用程序可能在本地平台上按预期运行,但在从 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