@making's memo

All Categories All Tags


Spring BatchでインメモリなJobRepositoryを使用する

Edit History

聞かれたのでメモ。

Spring BatchはデフォルトでJob管理のためのメタデータテーブルをDBに作成する。
Spring Bootを使うと設定不要でそのテーブルが作成され、アクセスするためのJobRepositoryなどが作られる。

ジョブ自体はDBを使うが、リスタートや実行結果の管理など不要な場合にメタデータテーブルを作りたくなければ、次のようなBatchConfigurerを作れば、インメモリなJobRepositoryが作成される。

@Bean
DefaultBatchConfigurer batchConfigurer() {
    return new DefaultBatchConfigurer() {
        @Override
        public void setDataSource(DataSource dataSource) {
        }
    };
}

これはDefaultBatchConfigurerの実装をよく見るとたまたまそう動くって感じのやり方。

これでもいいけど、BatchConfigurerの仕様通り書くと、

@Bean
DefaultBatchConfigurer batchConfigurer() {
    return new DefaultBatchConfigurer() {
        private final JobRepository jobRepository;
        private final JobExplorer jobExplorer;
        private final JobLauncher jobLauncher;

        {
            MapJobRepositoryFactoryBean jobRepositoryFactory = new MapJobRepositoryFactoryBean();
            try {
                this.jobRepository = jobRepositoryFactory.getObject();
                MapJobExplorerFactoryBean jobExplorerFactory = new MapJobExplorerFactoryBean(
                        jobRepositoryFactory);
                this.jobExplorer = jobExplorerFactory.getObject();
                SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
                jobLauncher.setJobRepository(jobRepository);
                jobLauncher.afterPropertiesSet();
                this.jobLauncher = jobLauncher;
            }
            catch (Exception e) {
                throw new BatchConfigurationException(e);
            }
        }

        @Override
        public JobRepository getJobRepository() {
            return jobRepository;
        }

        @Override
        public JobExplorer getJobExplorer() {
            return jobExplorer;
        }

        @Override
        public JobLauncher getJobLauncher() {
            return jobLauncher;
        }
    };
}

こんな感じ。

上記の内容はSpring BatchのProject LeadであるMichael Minellaに一応、確認した。
DefaultBatchConfigurer#initializeをoverrideする方法もあるけど、上記コードのほうがメンテナンスコード量が小さいので良いとのこと。

なお、Spring TeamとしてはDBでメタデータを管理するのが推奨

なお、メタデータテーブル様のDDLが実行されないように、次のプロパティも設定しておいたほうが良い。

spring.batch.initializer.enabled=false

このエントリーをはてなブックマークに追加