Spring Cloud Data Flow 忽略由 spring 批处理应用程序配置的数据源
Spring Cloud Data Flow ignores datasources configured by a spring batch app
我正在设置 Spring 云数据流的实例。我有 运行 以下命令:
1. Run skipper server: java -jar spring-cloud-skipper-server-2.0.3.RELEASE.jar &
2. Run Dataflow server: java -jar spring-cloud-dataflow-server-2.1.2.RELEASE.jar \
--spring.datasource.url=jdbc:postgresql://10.136.66.44:8080/springclouddataflow \
--spring.datasource.username=springclouddataflow \
--spring.datasource.password=123456 \
--spring.datasource.driver-class-name=org.postgresql.Driver \
--server.port=80 &
在第二步中,我使用的是 postgres 数据库,而不是默认的 h2。
我已经使用 spring 批处理开发了一个 spring 启动作业以部署到这个平台中。该作业使用两个数据源:springclouddataflow 用于 Spring,任务元数据和 bill运行 用于我的业务逻辑。当我在本地 运行 应用程序时,它会按预期将元数据保存在 springclouddataflow 中,并将我的业务数据保存在 bill运行 中。
问题是当我尝试在 Spring Cloud Dataflow 中执行 de job 时。该平台忽略了我配置的业务逻辑数据库,仅使用 springclouddataflow 数据库,该数据库应该仅存储元数据。
我已经在官方documentation中搜索过了。它解释了如何使用不同的数据库进行元数据存储以及如何在应用程序中配置多个数据库。我已按照说明进行操作,但没有成功。
application.properties
logging.level.org.springframework.cloud.task=debug
spring.datasource.initialization-mode=always
spring.batch.initialize-schema=always
spring.application.name=Bill Run
spring.datasource.jdbc-url=jdbc:postgresql://10.136.66.44:8080/springclouddataflow?useSSL=false
spring.datasource.username=springclouddataflow
spring.datasource.password=123456
spring.datasource.driver-class-name=org.postgresql.Driver
app.datasource.jdbc-url=jdbc:postgresql://10.136.66.44:8080/billrun?useSSL=false
app.datasource.username=springclouddataflow
app.datasource.password=123456
app.datasource.driver-class-name=org.postgresql.Driver
数据源配置
@Configuration
public class DatasourceConfiguration {
@Bean(name = "appDatasource")
@ConfigurationProperties(prefix = "app.datasource")
public DataSource sourceDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource springDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public TaskConfigurer taskConfigurer() {
return new DefaultTaskConfigurer(springDataSource());
}
}
计费配置
@Configuration
@EnableTask
@EnableBatchProcessing
public class BillingConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Value("${usage.file.name:classpath:usageinfo.json}")
private Resource usageResource;
@Bean
public Job job1(ItemReader<Usage> reader, ItemProcessor<Usage, Bill> itemProcessor, ItemWriter<Bill> writer) {
Step step = stepBuilderFactory.get("BillProcessing").<Usage, Bill>chunk(1).reader(reader)
.processor(itemProcessor).writer(writer).build();
return jobBuilderFactory.get("BillJob").incrementer(new RunIdIncrementer()).start(step).build();
}
@Bean
public JsonItemReader<Usage> jsonItemReader() {
ObjectMapper objectMapper = new ObjectMapper();
JacksonJsonObjectReader<Usage> jsonObjectReader = new JacksonJsonObjectReader<>(Usage.class);
jsonObjectReader.setMapper(objectMapper);
return new JsonItemReaderBuilder<Usage>().jsonObjectReader(jsonObjectReader).resource(usageResource)
.name("UsageJsonItemReader").build();
}
@Bean
public ItemWriter<Bill> jdbcBillWriter(@Qualifier("appDatasource") DataSource dataSource) {
JdbcBatchItemWriter<Bill> writer = new JdbcBatchItemWriterBuilder<Bill>().beanMapped().dataSource(dataSource)
.sql("INSERT INTO BILL_STATEMENTS (id, first_name, "
+ "last_name, minutes, data_usage,bill_amount) VALUES "
+ "(:id, :firstName, :lastName, :minutes, :dataUsage, " + ":billAmount)")
.build();
return writer;
}
@Bean
ItemProcessor<Usage, Bill> billProcessor() {
return new BillProcessor();
}
}
我试过将数据库属性作为参数传递给任务:
当我查看数据源时,只有 springclouddataflow 中保留的数据。我如何告诉 spring 云数据流使用我的应用程序数据源 (bill运行)?
看起来您正在自定义 Spring 云数据流服务器以使用我认为不需要的应用程序数据源。
您可以像上面发布的那样启动您的 SCDF 服务器:
1. Run skipper server: java -jar spring-cloud-skipper-server-2.0.3.RELEASE.jar &
2. Run Dataflow server: java -jar spring-cloud-dataflow-server-2.1.2.RELEASE.jar \
--spring.datasource.url=jdbc:postgresql://10.136.66.44:8080/springclouddataflow \
--spring.datasource.username=springclouddataflow \
--spring.datasource.password=123456 \
--spring.datasource.driver-class-name=org.postgresql.Driver \
--server.port=80 &
并且,让您的 Spring 批处理应用程序将其数据源属性作为 Spring 引导属性传递,而不是像上面那样使用自定义数据源配置。
您可以使用类似的方法找到 Spring 批处理应用程序开发指南 here
只要你尝试在你的应用程序中添加动态数据源,然后在需要的地方自动连接你的动态数据源
@Configuration
public class DataSourceConfig {
@Bean(name = "testingDataSource")
@ConfigurationProperties(prefix = "testing.datasource")
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "testingJdbcTemplate")
public JdbcTemplate testJdbcTemplate(@Qualifier("testingDataSource") DataSource dsMySQL) {
return new JdbcTemplate(dsMySQL);
}
}
测试:
数据源:
驱动程序类名:'com.mysql.cj.jdbc.Driver'
jdbc-url: 'jdbc:mysql://localhost/dbName'
用户名:'uname'
密码:'passworcd'
我正在设置 Spring 云数据流的实例。我有 运行 以下命令:
1. Run skipper server: java -jar spring-cloud-skipper-server-2.0.3.RELEASE.jar &
2. Run Dataflow server: java -jar spring-cloud-dataflow-server-2.1.2.RELEASE.jar \
--spring.datasource.url=jdbc:postgresql://10.136.66.44:8080/springclouddataflow \
--spring.datasource.username=springclouddataflow \
--spring.datasource.password=123456 \
--spring.datasource.driver-class-name=org.postgresql.Driver \
--server.port=80 &
在第二步中,我使用的是 postgres 数据库,而不是默认的 h2。
我已经使用 spring 批处理开发了一个 spring 启动作业以部署到这个平台中。该作业使用两个数据源:springclouddataflow 用于 Spring,任务元数据和 bill运行 用于我的业务逻辑。当我在本地 运行 应用程序时,它会按预期将元数据保存在 springclouddataflow 中,并将我的业务数据保存在 bill运行 中。 问题是当我尝试在 Spring Cloud Dataflow 中执行 de job 时。该平台忽略了我配置的业务逻辑数据库,仅使用 springclouddataflow 数据库,该数据库应该仅存储元数据。
我已经在官方documentation中搜索过了。它解释了如何使用不同的数据库进行元数据存储以及如何在应用程序中配置多个数据库。我已按照说明进行操作,但没有成功。
application.properties
logging.level.org.springframework.cloud.task=debug
spring.datasource.initialization-mode=always
spring.batch.initialize-schema=always
spring.application.name=Bill Run
spring.datasource.jdbc-url=jdbc:postgresql://10.136.66.44:8080/springclouddataflow?useSSL=false
spring.datasource.username=springclouddataflow
spring.datasource.password=123456
spring.datasource.driver-class-name=org.postgresql.Driver
app.datasource.jdbc-url=jdbc:postgresql://10.136.66.44:8080/billrun?useSSL=false
app.datasource.username=springclouddataflow
app.datasource.password=123456
app.datasource.driver-class-name=org.postgresql.Driver
数据源配置
@Configuration
public class DatasourceConfiguration {
@Bean(name = "appDatasource")
@ConfigurationProperties(prefix = "app.datasource")
public DataSource sourceDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource springDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public TaskConfigurer taskConfigurer() {
return new DefaultTaskConfigurer(springDataSource());
}
}
计费配置
@Configuration
@EnableTask
@EnableBatchProcessing
public class BillingConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Value("${usage.file.name:classpath:usageinfo.json}")
private Resource usageResource;
@Bean
public Job job1(ItemReader<Usage> reader, ItemProcessor<Usage, Bill> itemProcessor, ItemWriter<Bill> writer) {
Step step = stepBuilderFactory.get("BillProcessing").<Usage, Bill>chunk(1).reader(reader)
.processor(itemProcessor).writer(writer).build();
return jobBuilderFactory.get("BillJob").incrementer(new RunIdIncrementer()).start(step).build();
}
@Bean
public JsonItemReader<Usage> jsonItemReader() {
ObjectMapper objectMapper = new ObjectMapper();
JacksonJsonObjectReader<Usage> jsonObjectReader = new JacksonJsonObjectReader<>(Usage.class);
jsonObjectReader.setMapper(objectMapper);
return new JsonItemReaderBuilder<Usage>().jsonObjectReader(jsonObjectReader).resource(usageResource)
.name("UsageJsonItemReader").build();
}
@Bean
public ItemWriter<Bill> jdbcBillWriter(@Qualifier("appDatasource") DataSource dataSource) {
JdbcBatchItemWriter<Bill> writer = new JdbcBatchItemWriterBuilder<Bill>().beanMapped().dataSource(dataSource)
.sql("INSERT INTO BILL_STATEMENTS (id, first_name, "
+ "last_name, minutes, data_usage,bill_amount) VALUES "
+ "(:id, :firstName, :lastName, :minutes, :dataUsage, " + ":billAmount)")
.build();
return writer;
}
@Bean
ItemProcessor<Usage, Bill> billProcessor() {
return new BillProcessor();
}
}
我试过将数据库属性作为参数传递给任务:
当我查看数据源时,只有 springclouddataflow 中保留的数据。我如何告诉 spring 云数据流使用我的应用程序数据源 (bill运行)?
看起来您正在自定义 Spring 云数据流服务器以使用我认为不需要的应用程序数据源。
您可以像上面发布的那样启动您的 SCDF 服务器:
1. Run skipper server: java -jar spring-cloud-skipper-server-2.0.3.RELEASE.jar &
2. Run Dataflow server: java -jar spring-cloud-dataflow-server-2.1.2.RELEASE.jar \
--spring.datasource.url=jdbc:postgresql://10.136.66.44:8080/springclouddataflow \
--spring.datasource.username=springclouddataflow \
--spring.datasource.password=123456 \
--spring.datasource.driver-class-name=org.postgresql.Driver \
--server.port=80 &
并且,让您的 Spring 批处理应用程序将其数据源属性作为 Spring 引导属性传递,而不是像上面那样使用自定义数据源配置。
您可以使用类似的方法找到 Spring 批处理应用程序开发指南 here
只要你尝试在你的应用程序中添加动态数据源,然后在需要的地方自动连接你的动态数据源
@Configuration
public class DataSourceConfig {
@Bean(name = "testingDataSource")
@ConfigurationProperties(prefix = "testing.datasource")
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "testingJdbcTemplate")
public JdbcTemplate testJdbcTemplate(@Qualifier("testingDataSource") DataSource dsMySQL) {
return new JdbcTemplate(dsMySQL);
}
}
测试: 数据源: 驱动程序类名:'com.mysql.cj.jdbc.Driver' jdbc-url: 'jdbc:mysql://localhost/dbName' 用户名:'uname' 密码:'passworcd'