LoginSignup
5
4

More than 1 year has passed since last update.

【SpringBatch】メタテーブルを利用したくないとき

Last updated at Posted at 2020-11-07

概要

  • spring-batchではデフォルトでメタテーブルを使用し、ジョブの管理をしてくれる
  • が、そのメタテーブルを利用したくない時の設定方法をまとめた

SpringBoot3(SpringBatch5)についてはこちらをご覧ください🙇‍♂️

実装方法

BasicBatchConfigurerを継承したクラスをBean登録してあげるだけ!

NoMetaTableConfigurer.java
@Component
public class NoMetaTableConfigurer extends BasicBatchConfigurer {
    private final JobRepository jobRepository;
    private final JobExplorer jobExplorer;

    /**
     * constructor
     */
    public NoMetaTableConfigurer(
            BatchProperties properties,
            DataSource dataSource,
            TransactionManagerCustomizers transactionManagerCustomizers) {
        super(properties, dataSource, transactionManagerCustomizers);

        MapJobRepositoryFactoryBean repoFactory = new MapJobRepositoryFactoryBean(new ResourcelessTransactionManager());
        repoFactory.afterPropertiesSet();
        this.jobRepository = repoFactory.getObject();

        MapJobExplorerFactoryBean explFactory = new MapJobExplorerFactoryBean(repoFactory);
        explFactory.afterPropertiesSet();
        this.jobExplorer = explFactory.getObject();
    }

    /**
     * メタテーブルを使用しないようにするためにcreateJobRepositoryを独自に定義.
     */
    @Override
    protected JobRepository createJobRepository() {
        return this.jobRepository;
    }

    /**
     * メタテーブルを使用しないようにするためにcreateJobExplorerを独自に定義.
     */
    @Override
    public JobExplorer createJobExplorer() {
        return this.jobExplorer;
    }
}

ResourcelessTransactionManagerMapJobRepositoryFactoryBean,MapJobExplorerFactoryBeanを使えばOK!

少し補足すると、
SpringBatchはBatchConfigurerの実装クラスによって動作を変えられるのですが、
デフォルトではBasicBatchConfigurerを使用しているようでした。

そのため、BasicBatchConfigurerを継承し、メタテーブルを利用しなくする設定だけしてみました

実装方法(H2Db利用)

※2021/05追記

MapJobRepositoryFactoryBean
使用すべきではありません。

とのことなので、H2DBにメタデータを登録する方向性も検討してみました😇

ひとまずH2DBを依存に追加

build.gradle
dependencies {
    ...
    runtimeOnly 'com.h2database:h2'
}

実装の方は、バッチ処理で使用するDataSourceとは別に、
メタデータ用のDataSourceを@BatchDataSourceをつけてBean登録してあげればOK!

@Configuration
public class MetadataConfiguration {
    @Bean
    @BatchDataSource
    public HikariDataSource metaDatasource() {
        var config = new HikariConfig();
        config.setJdbcUrl( "jdbc:h2:./h2db/meta" );
        config.setUsername("sa");
        config.setDriverClassName("org.h2.Driver");
        return new HikariDataSource( config );
    }

    @Bean
    @Primary
    public HikariDataSource dataSource(DataSourceProperties properties) {
        HikariDataSource dataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
        if (StringUtils.hasText(properties.getName())) {
            dataSource.setPoolName(properties.getName());
        }
        return dataSource;
    }
}

あ、メタテーブルの初期化の設定もお忘れなく

application.yml
spring:
  batch:
    jdbc:
      initialize-schema: always

kubernetes等のコンテナで起動する類のバッチだと、毎回H2DBが初期構築されるはずなので、
initialize-schema: alwaysで問題ないはず!
(もちろん永続化の要件がない前提)

自問自答QA

Q. どうしてメタテーブルを利用したくないの?

A. 利用したくないというよりも、利用できない…

DBの権限でアプリケーションユーザーではテーブル作成をできなくしているのと、
spring-batchのバージョンアップ等でテーブルの変更があったときについていくのが大変

Q. じゃあspring-batchじゃなくてもよくない?

A. pushgatewayにメトリクス送信してくれる機能は使いたいのです😇

参考: Pushgatewayを使ってSpringBatchのメトリクス収集

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4