【问题标题】:How to give different Beans in different classes using spring boot batch如何使用spring boot批处理在不同的类中赋予不同的bean
【发布时间】:2020-01-25 09:45:01
【问题描述】:

我正在尝试从 SQL 服务器加载数据,应用一些转换并使用 spring 批处理调度程序将其放入 CSV。当所有东西都在同一个类中时,一切都很好。

这是我的代码:

package com.abc.tools.bootbatch;

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
public DataSource dataSource;

private static final String qry = "select top 20 colA, colB, colC from ABC";
private Resource outputResource = new FileSystemResource("output/outputData.csv");

@Bean
public DataSource dataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driver_class);
    dataSource.setUrl("db_url");
    dataSource.setUsername(usr);
    dataSource.setPassword(pwd);

    return dataSource;
}

@Bean
ItemReader<Trade> reader() {
    JdbcCursorItemReader<Trade> databaseReader = new JdbcCursorItemReader<>();

    databaseReader.setDataSource(dataSource);
    databaseReader.setSql(qry);
    databaseReader.setRowMapper(new BeanPropertyRowMapper<>(Trade.class));

    return databaseReader;
}

@Bean
public TradeProcessor processor() {
    return new TradeProcessor();
}

@Bean
public FlatFileItemWriter<Trade> writer()
{
    //Create writer instance
    FlatFileItemWriter<Trade> writer = new FlatFileItemWriter<>();

    //Set output file location
    writer.setResource(outputResource);

    //All job repetitions should "append" to same output file
    writer.setAppendAllowed(true);

    //Name field values sequence based on object properties
    writer.setLineAggregator(new DelimitedLineAggregator<Trade>() {
        {
            setDelimiter(",");
            setFieldExtractor(new BeanWrapperFieldExtractor<Trade>() {
                {
                    setNames(new String[] { "colA", "colB", "colC" });
                }
            });
        }
    });
    return writer;
}

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1").<Trade, Trade> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();
}

@Bean
public Job exportUserJob() {
    return jobBuilderFactory.get("exportUserJob")
            .incrementer(new RunIdIncrementer())
            .flow(step1())
            .end()
            .build();
}

}

当我在不同的类中分离处理、加载和数据读取时,使用自动装配可以正常工作,除非我使用批处理作业。在使用批处理作业时,它会在实例化数据库时出错。 所以我删除了自动连线并尝试做这样的事情:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
public DBConfig dbConfig;

public DataConnection dataconnection=new DataConnection();
DataReader reader=new DataReader();
TradeProcessor processor=new TradeProcessor();
FlatFileWriter flatFileWriter=new FlatFileWriter();

DataSource ds=dataconnection.getDataSource(dbConfig);


@Bean
public Step step1() {
    return stepBuilderFactory.get("step1").<Trade, Trade> chunk(10)
            .reader(reader.reader(ds))
            .processor(processor.processor())
            .writer(flatFileWriter.writer())
            .build();
}

@Bean
public Job exportUserJob() {
    return jobBuilderFactory.get("exportUserJob")
            .incrementer(new RunIdIncrementer())
            .flow(step1())
            .end()
            .build();
}

}

这导致无法初始化 BatchConfiguration

org.springframework.beans.factory.BeanCreationException:创建名为“batchConfiguration”的bean时出错

我想我缺少一些东西来汇总所有内容。我是 Spring 新手,感谢任何帮助

【问题讨论】:

  • 这看起来像是一个配置/组件扫描问题,但如果不看看您是如何设置应用程序的(组件扫描和配置注册表),就很难说。见stackoverflow.com/questions/42111094/…

标签: java spring spring-boot spring-batch autowired


【解决方案1】:

在您的第一个示例中,您正在自动装配数据源并在同一类中声明数据源 bean,这是不正确的。在第二个示例中,您可以使用 @Import(DBConfig.class) 导入它,而不是自动装配 DBConfig,并根据需要在作业配置中自动装配数据源。这是一个典型的配置:

@Configuration
public class DBConfig {

   @Bean
   public DataSource dataSource() {
      final DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setDriverClassName(driver_class);
      dataSource.setUrl("db_url");
      dataSource.setUsername(usr);
      dataSource.setPassword(pwd);
      return dataSource;
    }

}

@Configuration
@EnableBatchProcessing
@Import(DBConfig.class)
public class BatchConfiguration {

   @Bean
   ItemReader<Trade> reader(DataSource datasource) {
      // use datasource to configure the reader
   }

}

由于您使用 Spring Boot,您可以删除 DBConfig 类,根据需要在您的 application.properties 文件中配置数据源,数据源将自动注入您的 BatchConfiguration

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多