使用Spring Batch和自动配置以及非标准数据库

时间:2017-04-05 20:40:28

标签: spring-boot spring-batch

我正在尝试创建一个Spring Batch应用程序。我们使用SQL Anywhere数据库,它实际上是SQLSERVER,一种已知的数据库类型。为了简化操作,我在主类上使用@SpringBootApplication,在配置类上使用@EnableBatchProcessing

问题是我的数据库驱动程序sybase.jdbc4.sqlanywhere.IDriver返回了产品名称" SQL Anywhere"并且这不被Spring识别,导致各种错误。通过在配置类中显式创建JobRepositoryFactoryBean,我能够通过其中一些:

/**
 * We can't rely on Spring Boot as it can't set the database type properly.
 * 
 * By explicitly requiring the arguments in the constructor, we force the Autowiring
 * to occur.
 */
@Bean
public JobRepositoryFactoryBean jobRepositoryFactory(DataSource ds, PlatformTransactionManager tm) {
    JobRepositoryFactoryBean jf = new JobRepositoryFactoryBean();

    jf.setDataSource(ds);
    jf.setTransactionManager(tm);
    jf.setDatabaseType("SQLSERVER");
    jf.setTablePrefix("DBA.BATCH_");
    jf.setIsolationLevelForCreate("ISOLATION_SERIALIZABLE");    // only one instance at a time

    return jf;
}

但是,DefaultBatchConfigurer在intialize函数中失败,因为它显式构造了自己的JobExplorerFactoryBean。

我想知道是否有一些简单的方法,或者我是否必须复制DefaultBatchConfigurer类中的工作并自己定义所有bean并删除@EnableBatchProcessing注释。

1 个答案:

答案 0 :(得分:1)

我能够解决这个问题,我希望它可以帮助任何尝试将Spring Batch与开箱即用数据库一起使用的人。有必要扩展DefaultBatchConfigurer并覆盖createJobRepository()函数。此外,您应该禁用自动作业表创建。

这是我创建的类,可以用作任何SQL Anywhere Spring Batch作业的基础:

@EnableBatchProcessing
public class SqlAnywhereBatchConfigurer extends DefaultBatchConfigurer {

  @Autowired
  private DataSource dataSource;
  @Autowired
  private PlatformTransactionManager transactionManager;

  public SqlAnywhereBatchConfigurer() {
      super();
  }

  public SqlAnywhereBatchConfigurer(DataSource dataSource) {
      super(dataSource);
  }

  @Override
  protected JobRepository createJobRepository() throws Exception {
    JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
    factory.setDataSource(dataSource);
    factory.setTransactionManager(transactionManager);
    factory.setDatabaseType("SQLSERVER");
    factory.afterPropertiesSet();
    return factory.getObject();
  }
}

请务必先使用schema-sqlserver.sql设置表格。

您必须在application.properties我有:

中的配置中定义数据源
# database
spring.datasource.url=jdbc:sqlanywhere:Server=<your server name>;port=2638
spring.datasource.username=<your username>
spring.datasource.password=<your password>
spring.datasource.driver-class-name=sybase.jdbc4.sqlanywhere.IDriver
# don't create tables on startup
spring.datasource.initialize=false
spring.batch.initializer.enabled=false

最后,值得一提的是,对于SQL Anywhere,至少JdbcCursorItemReader不起作用,因为设置预准备语句的获取方向会导致&#34;不支持&#34; SQL Exception被抛出。你可以通过扩展JdbcCursorItemReader并覆盖你自己班级中的applyStatementSettings函数(加上几个setter)来解决这个问题。