Spring批处理:批处理的数据源和步骤的数据源

Spring Batch: datasource for Batch and datasource for step

我需要访问两个数据源:

我在那里看到了几个关于如何创建自定义 batch configurer 的示例。

但是,有时:

  1. implements BatchConfigurer
  2. extends DefaultBatchConfigurer

目前我的配置文件是:

.
├── steps
│   └── MssqlBatchConfigurationStep.java
└── MainJobBatchConfiguration.java

我的步骤配置是:

@Configuration
public class MssqlBatchConfigurationStep {

    private DataSource dataSource;

    /**
     *
     * @param dataSource
     */
    public MssqlBatchConfigurationStep(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    /**
     *
     * @return
     */
    public ItemReader<Unitat> reader() {
        String sql = "SELECT operation,update_time,table_name,rowid,user_login,user_name, user_ip,application_name,application_version,new_value,old_value FROM renovastorage.data_log";

        JdbcCursorItemReader<Unitat> jdbcCursorItemReader = new JdbcCursorItemReader<>();
        jdbcCursorItemReader.setDataSource(this.dataSource);
        jdbcCursorItemReader.setSql(sql);
        jdbcCursorItemReader.setVerifyCursorPosition(false);
        jdbcCursorItemReader.setRowMapper(new UnitatRowMapper());

        return jdbcCursorItemReader;
    }

    /**
     *
     * @return
     */
    public ItemWriter<UnitatDenormalized> writer() {
        // write to solr
        return null;
    }

}

这里的问题是,这一步是获取默认数据源。此数据源与 Spring Batch.

获得的相同

为了解决这个问题,我想创建一个 "Batch Configurer" 来获取特定数据源而不是默认数据源。

在这里你可以看到我的工作配置:

@Configuration
@EnableBatchProcessing
// @EnableScheduling
public class MainJobBatchConfiguration {

    private JobBuilderFactory jobBuilderFactory;
    private StepBuilderFactory stepBuilderFactory;

    private MssqlBatchConfigurationStep unitatBatchStep;

    /**
     *
     * @param jobBuilderFactory
     * @param stepBuilderFactory
     */
    public MainJobBatchConfiguration(
        JobBuilderFactory jobBuilderFactory,
        StepBuilderFactory stepBuilderFactory,
        MssqlBatchConfigurationStep unitatBatchStep
    ) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
        this.unitatBatchStep = unitatBatchStep;
    }


    /**
     *
     * @return
     */
    @Bean
    public Step step() {
        return this.stepBuilderFactory
            .get("mssql")
            .<Unitat, UnitatDenormalized>chunk(10)
            .reader(this.unitatBatchStep.reader())
            .writer(this.unitatBatchStep.writer())
            .build();
    }

    /**
     *
     * @param step
     * @return
     */
    @Bean
    public Job job(Step step) {
        Job job = this.jobBuilderFactory.get("job1")
            .flow(step)
            .end()
            .build();
        return job;
    }

}

My step needs to get access to a mssql.

In order to solve that, I want to create a "Batch Configurer" in order to get specific datasource instead of the default one.

为了解决这个问题,我会在数据源上添加一个限定符来指定应该在步骤中使用哪个:

@Configuration
public class MssqlBatchConfigurationStep {

   private DataSource dataSource;

   /**
    *
    * @param dataSource
   */
   public MssqlBatchConfigurationStep(@Qualifier("YOUR_MSSQL_DATASOURCE_BEAN_NAME") DataSource dataSource) {
      this.dataSource = dataSource;
   }

}

这样,您的 reader 应该指向 mssql 数据源并从中读取数据。

您需要添加一个辅助数据源 bean 并自动装配该数据源。

application.properties

spring.second-datasource.url = [url]
spring.second-datasource.username = [username]
spring.second-datasource.password = [password]
spring.second-datasource.driverClassName= [driverClassName]

数据源配置

    @Primary
    @Bean(value = "defaultDataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource datasource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        return dataSource;
    }

    @Bean(value = "secondDataSource")
    @ConfigurationProperties(prefix = "spring.second-datasource")
    public DataSource ticketDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        return dataSource;
    }

在您的 reader.

中自动装配 secondDataSource
    private DataSource dataSource;

    /**
     *
     * @param dataSource
     */
    public MssqlBatchConfigurationStep(@Qualifier("secondDataSource") DataSource dataSource) {
        this.dataSource = dataSource;
    }