如何自定义构建具有 Oracle 驱动程序依赖性的 Spring 云数据流服务器?
How to do a Custom Build of Spring Cloud Data Flow server with Oracle driver dependency?
我一直在试用 SCDF 一段时间,打算使用 Oracle 数据库作为数据源。由于许可问题,必须将 Oracle 驱动程序添加到 SCDF 服务器的 class 路径,或者我们必须使用 Oracle 驱动程序依赖项(我有)自定义构建 SCDF 服务器。当我从 github 下载自定义构建项目 dataflow-server-22x(仅此项目)并尝试执行时,我在 pom.xml 中遇到了一个缺少工件的问题,如下所示。
Missing artifact io.pivotal:pivotal-cloudfoundry-client-reactor:jar:1.1.0.RELEASE
at <xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> of pom.xml
那么我必须如何执行此 SCDF jar 的自定义构建。我在这里错过了什么吗?
此外,我的意图只是构建一个包含一组批处理作业的 jar,这些作业可以部署在 SCDF 中并从 SCDF 编排。但我在这里没有使用 Docker 或 Kubernetes/CloudFoundry。
注意:我已经问了一个问题来澄清这个问题,这导致我遇到这个问题。他们在那里说我应该使用自定义构建,但无法确切说明如何或如何解决自定义构建引起的问题。因此我发布了这个问题。
提前致谢。
更新 1:
以上问题在Ilayaperumals的建议下得到解决。但是我遇到了另一个问题。
org.springframework.context.ApplicationContextException: Failed to start bean 'taskLifecycleListener'; nested exception is java.lang.IllegalArgumentException: Invalid TaskExecution, ID 3 not found
但是在我从 SCDF 执行任务后,我在 task_execution table 中看到 Id=3。自定义 SCDF 项目具有与我的 Spring 批处理作业属性相同的数据库配置 属性 值。这里需要注意的几件事是,
- Spring-boot-starter-parent : 2.2.5.RELEASE,
- Spring-云数据流:2.2.0.RELEASE
- 我使用批处理作业 class 的实例从 Boot 的主 class 加载我的所有 Batchjobs,只有主 class(启动所有作业)包含 @EnableTask 注释.下面是我的 class 结构。
@SpringBootApplication
@EnableScheduling
@EnableTask
public class SpringBootMainApplication{
@Autowired
Job1Loader job1Loader;
public static void main(String[] args) {
SpringApplication.run(SpringBootMainApplication.class, args);
}
@Scheduled(cron = "0 */1 * * * ?")
public void executeJob1Loader() throws Exception
{
JobParameters param = new JobParametersBuilder()
.addString("JobID",
String.valueOf(System.currentTimeMillis()))
.toJobParameters();
jobLauncher.run(job1Loader.loadJob1(), param);
}
}
//Job Config
@Configuration
@EnableBatchProcessing
public class Job1Loader {
@Bean
public Job loadJob1()
{
return jobBuilderFactory().get("JOb1Loader")
.incrementer(new RunIdIncrementer())
.flow(step01())
.end()
.build();;//return job
}
我在我的 Spring 工作项目中使用了两个不同的数据源,都是 oracle 数据源(不同的服务器)。我将其中一个标记为主要数据源并在我的 "DefaultTaskConfigurer" 自定义实现中使用了该数据源如下。
@Configuration
public class TaskConfig extends DefaultTaskConfigurer {
@Autowired
DatabaseConfig databaseConfig;
@Override
public DataSource getTaskDataSource() {
return databaseConfig.dataSource();//dataSource() returns the
primary ds
}
}
- 以下是我在 SCDF 自定义服务器和 Spring 批处理项目中使用的属性。
**Spring batch Job :**
spring.datasource.jdbc-url=jdbc:oracle:thin:@mydb
spring.datasource.username=db_user
spring.datasource.password=db_pwd
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
**SCDF customer Server:**
spring.datasource.url=jdbc:oracle:thin:@mydb
spring.datasource.username=db_user
spring.datasource.password=db_pwd
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
我尝试在启动服务器时提供数据库配置作为 args 以及一些其他选项,例如将 @Enabletask 添加到所有作业配置 classes,但其中 none 似乎有效。
我在这里错过了什么?
既然你提到你不 运行 CloudFoundry 上的这个并且特定的依赖性 io.pivotal:pivotal-cloudfoundry-client-reactor:jar
来自 spring-cloud-dataflow-platform-cloudfoundry
,你需要从自定义构建配置中删除这个依赖性作为以下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-dataflow-server</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dataflow-platform-cloudfoundry</artifactId>
</exclusion>
</exclusions>
</dependency>
此外,执行 ./mvnw dependency:tree
将帮助您确定依赖性来自何处:
\- org.springframework.cloud:spring-cloud-dataflow-platform-cloudfoundry:jar:2.5.0.BUILD-SNAPSHOT:compile
[INFO] | | +- org.springframework.cloud:spring-cloud-deployer-cloudfoundry:jar:2.3.0.BUILD-SNAPSHOT:compile
[INFO] | | | +- org.cloudfoundry:cloudfoundry-client-reactor:jar:4.1.0.RELEASE:compile
[INFO] | | | |
[INFO] | | | +- io.projectreactor.addons:reactor-extra:jar:3.3.2.RELEASE:compile
[INFO] | | | \- io.pivotal:pivotal-cloudfoundry-client-reactor:jar:2.0.0.RELEASE:compile
[INFO] | | | \- io.pivotal:pivotal-cloudfoundry-client:jar:2.0.0.RELEASE:compile
我一直在试用 SCDF 一段时间,打算使用 Oracle 数据库作为数据源。由于许可问题,必须将 Oracle 驱动程序添加到 SCDF 服务器的 class 路径,或者我们必须使用 Oracle 驱动程序依赖项(我有)自定义构建 SCDF 服务器。当我从 github 下载自定义构建项目 dataflow-server-22x(仅此项目)并尝试执行时,我在 pom.xml 中遇到了一个缺少工件的问题,如下所示。
Missing artifact io.pivotal:pivotal-cloudfoundry-client-reactor:jar:1.1.0.RELEASE
at <xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> of pom.xml
那么我必须如何执行此 SCDF jar 的自定义构建。我在这里错过了什么吗?
此外,我的意图只是构建一个包含一组批处理作业的 jar,这些作业可以部署在 SCDF 中并从 SCDF 编排。但我在这里没有使用 Docker 或 Kubernetes/CloudFoundry。
注意:我已经问了一个问题来澄清这个问题,这导致我遇到这个问题。他们在那里说我应该使用自定义构建,但无法确切说明如何或如何解决自定义构建引起的问题。因此我发布了这个问题。
提前致谢。
更新 1:
以上问题在Ilayaperumals的建议下得到解决。但是我遇到了另一个问题。
org.springframework.context.ApplicationContextException: Failed to start bean 'taskLifecycleListener'; nested exception is java.lang.IllegalArgumentException: Invalid TaskExecution, ID 3 not found
但是在我从 SCDF 执行任务后,我在 task_execution table 中看到 Id=3。自定义 SCDF 项目具有与我的 Spring 批处理作业属性相同的数据库配置 属性 值。这里需要注意的几件事是,
- Spring-boot-starter-parent : 2.2.5.RELEASE,
- Spring-云数据流:2.2.0.RELEASE
- 我使用批处理作业 class 的实例从 Boot 的主 class 加载我的所有 Batchjobs,只有主 class(启动所有作业)包含 @EnableTask 注释.下面是我的 class 结构。
@SpringBootApplication
@EnableScheduling
@EnableTask
public class SpringBootMainApplication{
@Autowired
Job1Loader job1Loader;
public static void main(String[] args) {
SpringApplication.run(SpringBootMainApplication.class, args);
}
@Scheduled(cron = "0 */1 * * * ?")
public void executeJob1Loader() throws Exception
{
JobParameters param = new JobParametersBuilder()
.addString("JobID",
String.valueOf(System.currentTimeMillis()))
.toJobParameters();
jobLauncher.run(job1Loader.loadJob1(), param);
}
}
//Job Config
@Configuration
@EnableBatchProcessing
public class Job1Loader {
@Bean
public Job loadJob1()
{
return jobBuilderFactory().get("JOb1Loader")
.incrementer(new RunIdIncrementer())
.flow(step01())
.end()
.build();;//return job
}
我在我的 Spring 工作项目中使用了两个不同的数据源,都是 oracle 数据源(不同的服务器)。我将其中一个标记为主要数据源并在我的 "DefaultTaskConfigurer" 自定义实现中使用了该数据源如下。
@Configuration
public class TaskConfig extends DefaultTaskConfigurer {
@Autowired
DatabaseConfig databaseConfig;
@Override
public DataSource getTaskDataSource() {
return databaseConfig.dataSource();//dataSource() returns the
primary ds
}
}
- 以下是我在 SCDF 自定义服务器和 Spring 批处理项目中使用的属性。
**Spring batch Job :**
spring.datasource.jdbc-url=jdbc:oracle:thin:@mydb
spring.datasource.username=db_user
spring.datasource.password=db_pwd
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
**SCDF customer Server:**
spring.datasource.url=jdbc:oracle:thin:@mydb
spring.datasource.username=db_user
spring.datasource.password=db_pwd
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
我尝试在启动服务器时提供数据库配置作为 args 以及一些其他选项,例如将 @Enabletask 添加到所有作业配置 classes,但其中 none 似乎有效。
我在这里错过了什么?
既然你提到你不 运行 CloudFoundry 上的这个并且特定的依赖性 io.pivotal:pivotal-cloudfoundry-client-reactor:jar
来自 spring-cloud-dataflow-platform-cloudfoundry
,你需要从自定义构建配置中删除这个依赖性作为以下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-dataflow-server</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dataflow-platform-cloudfoundry</artifactId>
</exclusion>
</exclusions>
</dependency>
此外,执行 ./mvnw dependency:tree
将帮助您确定依赖性来自何处:
\- org.springframework.cloud:spring-cloud-dataflow-platform-cloudfoundry:jar:2.5.0.BUILD-SNAPSHOT:compile
[INFO] | | +- org.springframework.cloud:spring-cloud-deployer-cloudfoundry:jar:2.3.0.BUILD-SNAPSHOT:compile
[INFO] | | | +- org.cloudfoundry:cloudfoundry-client-reactor:jar:4.1.0.RELEASE:compile
[INFO] | | | |
[INFO] | | | +- io.projectreactor.addons:reactor-extra:jar:3.3.2.RELEASE:compile
[INFO] | | | \- io.pivotal:pivotal-cloudfoundry-client-reactor:jar:2.0.0.RELEASE:compile
[INFO] | | | \- io.pivotal:pivotal-cloudfoundry-client:jar:2.0.0.RELEASE:compile