当前位置: 首页 > 知识库问答 >
问题:

如何正确编译/打包Spring云数据流的任务

姚钊
2023-03-14

鉴于我需要使用多个数据源,我在IntelliJ Idea 2020.1.3中根据Spring云任务示例编译了以下示例:https://github.com/mminella/spring-cloud-task/tree/master/spring-cloud-task-samples/multiple-datasources

然后,我使用mvn package将其打包在一个JAR中,将其复制到启动docker compose的位置(根据官方的SCDF(Spring Cloud Data Flow)本地部署说明),并将其添加到SCDF中,在SCDF外壳中运行以下命令:app register--type task--name multiple datasources--urifile://root/scdf/multiple-datasources-2.3.0-SNAPSHOT.jar

我使用SCDF添加了任务,如图所示:

当我尝试从仪表板运行任务时,执行实例没有提到任何开始时间或结束时间。仪表板上也没有任何显示。

使用任务执行日志从SCDF外壳程序中查阅日志

2020-07-14 02:38:14.403  INFO 63 --- [           main] i.spring.MultipleDataSourcesApplication  : Starting MultipleDataSourcesApplication v2.3.0-SNAPSHOT on 5856acfa7c62 with PID 63 (/root/scdf/multiple-datasources-2.3.0-SNAPSHOT.jar started by root in /tmp/289541567048/multiple-datasources-9c75a131-4ea9-40ff-ac42-44729162e6f5)
2020-07-14 02:38:14.407  INFO 63 --- [           main] i.spring.MultipleDataSourcesApplication  : No active profile set, falling back to default profiles: default
2020-07-14 02:38:17.242  INFO 63 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        : Starting embedded database: url='jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
2020-07-14 02:38:18.145  INFO 63 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        : Starting embedded database: url='jdbc:hsqldb:mem:testdb', username='sa'
2020-07-14 02:38:18.810 DEBUG 63 --- [           main] o.s.c.t.c.SimpleTaskAutoConfiguration    : Using io.spring.configuration.CustomTaskConfigurer TaskConfigurer
2020-07-14 02:38:18.823 DEBUG 63 --- [           main] o.s.c.t.c.DefaultTaskConfigurer          : No EntityManager was found, using DataSourceTransactionManager
2020-07-14 02:38:18.928 DEBUG 63 --- [           main] o.s.c.t.r.s.TaskRepositoryInitializer    : Initializing task schema for h2 database
2020-07-14 02:38:19.036 ERROR 63 --- [           main] o.s.c.t.listener.TaskLifecycleListener   : An event to end a task has been received for a task that has not yet started.
2020-07-14 02:38:19.036  WARN 63 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'taskLifecycleListener'; nested exception is java.lang.IllegalArgumentException: Invalid TaskExecution, ID 31 not found
2020-07-14 02:38:19.036  INFO 63 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        : Shutting down embedded database: url='jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false'
2020-07-14 02:38:19.245  INFO 63 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        : Shutting down embedded database: url='jdbc:hsqldb:mem:testdb'
2020-07-14 02:38:19.258 ERROR 63 --- [           main] o.s.c.t.listener.TaskLifecycleListener   : An event to end a task has been received for a task that has not yet started.
2020-07-14 02:38:19.264  INFO 63 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-07-14 02:38:19.273 ERROR 63 --- [           main] o.s.boot.SpringApplication               : Application run failed

以下错误尤其突出:

2020-07-14 02:38:19.036  WARN 63 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'taskLifecycleListener'; nested exception is java.lang.IllegalArgumentException: Invalid TaskExecution, ID 31 not found
2020-07-14 02:38:19.258 ERROR 63 --- [           main] o.s.c.t.listener.TaskLifecycleListener   : An event to end a task has been received for a task that has not yet started.
2020-07-14 02:38:19.264  INFO 63 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.

该示例在application.properties中有以下行:

spring.application.name=Demo Multiple DataSources Task
logging.level.org.springframework.cloud.task=DEBUG`

所以,如果我没有弄错的话,应该已经启用了调试。

具体来说,我的问题是:

1) 考虑到这是一个示例,即使未经修改也无法运行,我可能会忽略什么或做错什么?

2) 如何正确启用调试?

非常感谢。

PS:来自repo的示例已经具有H2数据库依赖性,这是在pom中使用Spring云数据流注册定制Spring云任务的答案。xml。

我没有尝试用当前的启动初始值设定项重新创建示例,但是我尝试用最新的初始值设定项创建一个简单的hello world,我得到了完全相同的错误。我不认为是初始化错误。

我还没有尝试最后一个建议,压倒一切。但考虑到这是一个官方示例,我真的需要覆盖默认配置吗?

PPS:我知道我的SCDF安装工作正常,因为我能够运行以下示例中的预打包时间戳程序:https://cloud.spring.io/spring-cloud-task-app-starters/


共有2个答案

澹台建华
2023-03-14

这似乎与任务应用程序没有使用与SpringCloud数据流相同的数据库有关。你需要确保,

  • 任务的数据源配置与SCDF的数据源配置相同
  • 任务应用程序中数据源jdbc依赖项的版本与您使用的SCDF版本兼容

您可以在这里阅读一些相关文档

佘缪文
2023-03-14

我遇到了同样的问题:每当我启动批处理作业时,任务执行就会增加。

我在数据库(我在批处理作业中使用的)中查询了任务执行表,但没有找到与该执行ID相关的内容。

我试图删除批处理作业并从Docker注册表重新导入应用程序,但任务执行仍然会增加,没有希望!

我查看了SCDF服务器配置。yaml文件,用于在Kubernetes上安装SCDF,并发现SCDF使用Mysql系统数据库存储其内容,这很奇怪!!

https://github.com/spring-cloud/spring-cloud-Dataflow/blob/main/src/kubernetes/server/server-config.yaml

url: jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT}/mysql

我查询了mysql系统数据库,发现里面有任务执行表,ID信息!

问题解决了,SCDF本身将任务执行ID保存在自己的数据库中,而我们的批处理应用程序使用不同的数据库,因此它产生了问题。我必须临时将批处理应用程序数据库更改为SCDF的数据库,即mysql系统数据库。

来自:app。一批Spring数据源。url=jdbc:mysql://mysql:3306/task?useSSL=false

发送至:app。一批Spring数据源。url=jdbc:mysql://mysql:3306/mysql?useSSL=false

结论:SCDF需要自己的数据库来管理任务执行,批处理应用程序(在批处理数据库旁边)应该指向该SCDF数据库才能工作。此外,在Kubernetes中安装SCDF期间,您应该将SCDF的数据库更改为其他位置,而不是mysql系统数据库

本教程向您展示了如何使批处理应用程序同时使用2个数据源

https://github.com/spring-cloud/spring-cloud-task/tree/main/spring-cloud-task-samples/multiple-datasources

此链接将添加有关此问题的更多信息:

https://github.com/spring-io/dataflow.spring.io/issues/161

背景:

我按照这个链接安装了SCDF服务器(这让我抓狂)

https://dataflow.spring.io/docs/installation/kubernetes/kubectl/#deploy-数据流服务器

它指向

https://github.com/spring-cloud/spring-cloud-dataflow/blob/main/src/kubernetes/server/server-config.yaml

而这个链接

https://dataflow.spring.io/docs/batch-developer-guides/batch/spring-batch/

使用mysql urlurl=jdbc创建批处理应用程序的指南:mysql://localhost:3306/task?useSSL=false(任务数据库),但它不会告诉您SCDF如何使用任务执行ID

我想Spring应该更新文档并添加更多关于SCDF任务执行过程的解释

 类似资料:
  • 我使用部署到pivotal cloud foundry的spring云数据流,将spring批处理作业作为spring云任务运行,这些作业需要aws凭据才能访问s3存储桶。 我尝试将aws凭据作为任务属性传递,但凭据作为参数或属性显示在任务的日志文件中。(https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/html

  • 我试图了解运行批处理任务时通过Spring Cloud数据流WRT数据源配置的预期行为。 Spring批处理数据库表(Batch\u JOB\u EXECUTION等)是否在SCDF数据库本身中?当通过SCDF启动任务时,似乎发生了一些神奇的事情,它在SCDF数据库中创建了这些表,并似乎在使用它们。它似乎正在将SCDF数据源注入我的应用程序? 我目前在localhost服务器版本2.0.1上运行。

  • 我在Openshift集群上安装了一个Spring Cloud数据流。我尝试注册一个应用程序,然后创建一个任务,一切都很好,但当我试图安排任务时,我遇到了以下异常: 我不知道这是什么意思,我是Dataflow的新手。我不明白为什么他试图使用Maven而不是kubernetes部署器,也不明白为什么我会出现这个错误。有人能再给我解释一下吗? 顺便说一句,我将这些应用程序注册为docker容器。

  • 我无法编译谷歌云数据流SDK。我在执行“mvn安装”时出错:

  • 我有一个从流-任务-启动器-数据流调用的组合任务 我将流处理器中的几个属性传递给任务启动器数据流和子任务,例如。。。 这可以正常工作,但我已经达到了最大字符限制,并在组合任务pod上得到一个sql异常,说明我已经超过了2500个字符的限制。我想为所有任务而不是单独设置属性以节省字符空间,但使用通配符不起作用 有没有办法为所有任务设置属性,而不必单独设置? 我尝试在kubernetes中的Sprin

  • 我试图存储我的源在Kafka一个单独的主题流源的最后读取记录。我怎么能实现这与Spring云数据流流应用程序。任何建议都会有很大帮助...