添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
安静的青蛙  ·  Axway Community·  6 月前    · 
5
4

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-11-07

  • spring-batchではデフォルトでメタテーブルを使用し、ジョブの管理をしてくれる
  • が、そのメタテーブルを利用したくない時の設定方法をまとめた
  • SpringBoot3(SpringBatch5)については こちら をご覧ください🙇‍♂️

    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追記

    実装の方は、バッチ処理で使用する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