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

Spring Cloud数据流忽略Spring批处理应用程序配置的数据源

贾成天
2023-03-14

我正在设置Spring Cloud Data Flow的实例。我运行了以下命令:

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 Boot作业,使用spring批处理部署在这个平台窗体中。该作业使用两个数据源:Spring的springclouddataflow和任务元数据,以及我的业务逻辑的billrun。当我在本地运行应用程序时,它会像预期的那样将元数据保存在springclouddataflow中,并将我的业务数据保存在billrun中。问题是当我试图在Spring云数据流中执行de-job时。plataform忽略我配置的业务逻辑数据库,只使用springclouddataflow数据库,该数据库应该只存储元数据。

我已经在官方留档中搜索过了。它解释了如何使用不同的数据库进行元数据存储,以及如何在应用程序中配置多个数据库。我按照说明进行了操作,但没有成功。

应用属性

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云数据流使用我的应用程序数据源(billrun)?

共有2个答案

施彬郁
2023-03-14

只需尝试在应用程序中添加动态数据源,如下所示,然后根据需要自动连接动态数据源

@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);
    }
    
}

测试:数据源:driverClassName:'com.mysql。希杰。jdbc。驱动程序“jdbc url:”jdbc:mysql://localhost/dbName'用户名:'uname'密码:'passworcd'

沈思博
2023-03-14

看起来您正在自定义Spring Cloud数据流服务器以使用我认为不需要的应用程序数据源。

您可以按照上面的说明启动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 Boot属性传递,而不是像上面那样使用自定义数据源配置。

您可以在此处找到使用类似方法的Spring Batch应用程序开发指南

 类似资料:
  • 顺便说一句:我的应用程序是一些REST控制器和一些批处理作业的组合。那么使用云数据流有意义吗?如果没有,那么是否有更好的控制台管理器用于批处理作业(如重新启动、取消作业门户)等?

  • 只是在试用春云流 当我把它作为一个独立的jar运行时(就像另一个springboot应用程序一样),它尊重这个应用程序。物业和所有工程按预期进行。 当我使用SCDF创建流时,它会忽略属性,并使用约定流名称创建交换。app_名称不是我想要的。 我希望在某个时候,我希望这些应用程序与SpringCloudConfig服务器集成,在那里我可以从不同的来源完全外部化配置。 有人可以建议我遗漏了什么,以便S

  • 我是新的stackoverflow,但阅读吨的帖子在这里和现在stuck.myapplication.properties阅读,但配置hikaricp的部分被忽略/没有影响。 我读了https://www.javadevjournal.com/spring-boot/spring-boot-hikari/,在那里遵循了这些步骤,仍然取得了任何成功。 波姆。xml 应用属性 黑名单申请。课程: 配置

  • 我需要访问两个数据源: Spring批处理存储库:在内存H2中 我的步骤需要访问。 我在那里看到了几个关于如何创建自定义

  • 我使用的是Spring Batch 2.1.8。释放我有一个文件,它由一些头信息和一些需要处理的记录组成。 我有一个使用面向块处理的步骤。该步骤包含ItemReader和ItemWriter的实现。ItemReader实现是线程安全的,而ItemWriter不是。 我想在处理(或写入)任何记录之前使用标题信息。在继续使用面向块的处理时,如何确保这一点? 建议的解决方案:一种解决方案可以是编写一个预

  • 为了能够测试应用程序的某些方面,我创建了这个测试设置。因为我需要的自定义实现,所以无法使用经典的注释来完成,而是使用了以下initialisazion: 所敬畏的SaveMetestApplication: 是一个将某些配置和必需的bean结合在一起的配置: 然后是引用的,其中有两个bean是自动连线的: 自动连线的两个bean是在导入的中定义的。当我使用启动测试时,我得到了实际找到的bean的日