SpringBoot3(SpringBatch5)については こちら をご覧ください🙇♂️
@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;
ResourcelessTransactionManager
とMapJobRepositoryFactoryBean
,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にメトリクス送信してくれる機能は使いたいのです😇