Spring批处理2.2 JavaConfig

时间:2013-06-13 15:13:23

标签: java spring annotations spring-batch

我正在努力让Spring Batch 2.2与JavaConfig一起工作。

现在他们有一个@EnableBatchProcessing注释,可以设置很多东西。 默认情况下,注释使用数据源作为其作业数据,但我们不希望保存此数据,也不希望为其创建表。文档说明了一些关于自定义的内容,但我无法使其正常工作:

  • 用户必须在上下文中提供DataSource作为bean,或者在配置类本身中实现BatchConfigurer,例如:

public class AppConfig extends DefaultBatchConfigurer {

在我们的旧版本中,我们已经能够使用MapJobRepositoryFactoryBean类,因此它将所有数据保存在内存中。无论如何使用完整的JavaConfig方式而不是定义DataSource?我无法让它发挥作用。

即使我定义了两个数据源(一个永远不会被使用的HSQL内存)和我们真正的Oracle数据源,它也不起作用,因为它找到了两个数据源而不是一个。

任何人都知道如何让这个工作?或者是回归到以XML方式配置它的唯一解决方案?

2 个答案:

答案 0 :(得分:6)

假设没有其他工件需要DataSource,您可以使用java config创建没有DataSource的上下文。为此,您的配置需要在指出时扩展DefaultBatchConfigurer。在那里,你将覆盖两个方法,createJobRepository()和setDataSource()。下面是一个示例上下文(它没有定义一个或多个步骤,但它正确地引导了所有相关的bean)。

@Configuration
@EnableBatchProcessing
public static class BatchConfiguration extends DefaultBatchConfigurer {

    @Override
    protected JobRepository createJobRepository() throws Exception {
        MapJobRepositoryFactoryBean factory = 
            new MapJobRepositoryFactoryBean();
        factory.afterPropertiesSet();
        return  (JobRepository) factory.getObject();
    }

    @Override
    @Autowired
    public void setDataSource(DataSource dataSource) {
        if(dataSource != null) {
            super.setDataSource(dataSource);
        }
    }

    @Bean
    public DataSource dataSource() {
        return null;
    }
}

我认为简化这将是一个有用的功能,并将其添加到Jira。您可以在此处跟踪其进度:https://jira.springsource.org/browse/BATCH-2048

答案 1 :(得分:-1)

只需在BatchConfig类中定义dataSource()方法即可 这是如何

@Bean
public DataSource dataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(driverUrl);
    dataSource.setUsername(driverUsername);
    dataSource.setPassword(driverPassword);
    return dataSource;
}

设置TransactionManager时会自动调用此项