【问题标题】:Spring batch 2.2 JavaConfigSpring批处理2.2 JavaConfig
【发布时间】:2013-06-13 15:13:23
【问题描述】:

我正在尝试让 Spring Batch 2.2 与 JavaConfig 一起使用。

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

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

public class AppConfig extends DefaultBatchConfigurer {

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

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

有人知道如何让它工作吗?还是唯一的解决方案是回到以 XML 方式配置它?

【问题讨论】:

    标签: java spring annotations spring-batch


    【解决方案1】:

    假设没有其他工件需要 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

    【讨论】:

    • 在我们的例子中,问题是我们的业务逻辑确实需要另一个数据源。如问题中所述,如果您这样做,将引发异常,因为找到了两个数据源..
    • 只是为了确认...您正在寻找具有两个数据源并使用地图作业存储库的 javaconfig,对吗?
    • 我们试图做的是将我们的数据源用于业务逻辑,并将嵌入式存储库用于 Spring Batch 本身。这太麻烦了,所以我们使用 XML 方式来进行作业配置本身。不过感谢您的回复!
    • 您可以使用扩展 DefaultBatchConfigurer 的 MapJobRepositoryFactoryBean 和 AppConfig 为作业创建数据源,并为业务逻辑提供辅助数据源。然而,数据库类型是使用辅助数据源的元数据隐式确定的。它适用于 Oracle,但是像 Sybase IQ 这样的提供程序却失败了。在这种情况下,您可能需要使用 JobRepositoryFactoryBean 并将数据库类型手动设置为 Sybase。
    • @MichaelMinella,您指出了现在已修复的 Jira 问题。但我在文档中找不到 3.0.0 版中新的 Java 配置用法。
    【解决方案2】:

    只需在 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 时自动调用

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 1970-01-01
      • 2019-01-30
      • 2014-12-03
      • 1970-01-01
      • 2016-01-04
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多