2017-04-05 74 views
0

Springバッチアプリケーションを作成しようとしています。 SQL Anywhereデータベースを使用します。これは、既知のデータベースタイプであるSQLSERVERです。私のメインクラスでは@SpringBootApplication、構成クラスでは@EnableBatchProcessingを使用しています。 は、製品名「SQL Anywhere」を返しますが、これはSpringによって認識されず、さまざまなエラーが発生します。私は明示的に私の構成クラスでJobRepositoryFactoryBeanを作成することにより、それらのいくつかを乗り越えることができた:それは明示的に独自のJobExplorerFactoryBeanを構築するため自動構成と非標準データベースでSpringバッチを使用する

/** 
* 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機能に障害が発生しました。

これは単純な方法か、DefaultBatchConfigurerクラスの作業を複製し、すべてのBeanを自分で定義して、@EnableBatchProcessing注釈を削除する必要があるのだろうかと思います。

答えて

0

私はこれを解決することができました。私は、Spring Batchをすぐに使用できるデータベースで使用しようとする人に役立つことを願っています。 DefaultBatchConfigurerを拡張し、createJobRepository()関数をオーバーライドする必要があります。また、自動ジョブテーブルの作成を無効にする必要があります。

@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を使用してください:ここで

は、任意のSQL Anywhereに春のバッチジョブのベースとして使用することができ、私はそれを作成したクラスです。

あなたは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が動作しないことをここで言及する価値がある、のフェッチ方向を設定するため、準備されたステートメントは「サポートされていません」SQL Exceptionをスローします。あなたはJdbcCursorItemReaderを拡張し、自分のクラスでapplyStatementSettings関数(そして少数のセッター)をオーバーライドすることでこれを回避することができます。

関連する問題