Posted at

[Java][Spring][Spring Batch] Spring Batchのメタデータテーブルを作らせない/使わせない

More than 1 year has passed since last update.


前提

Spring Batchは、ジョブやらなんやらの状態を保存するために、データベースを使うようになっています。

普通には便利なんだと思われますが、そこまで重たいバッチじゃないんだよぉぉ、というときにはちと邪魔です。

そんなテーブルを使わない・作らせない方法です。

こちらの記事が大変参考になりました。 :smile:

Spring Batch でメタテーブルを使いたくないのに使用されてしまう時はこうする


環境


  • Spring Boot 1.2.7

  • (Spring Batch 3.0.5)


テーブルを作らせない方法

テーブルの作成は、Spring Bootが自動構成するなかで行われています。

よくできてますねー。

でも、今回は省略。

プロパティファイルかyamlファイルに、以下の設定を追加します。


application.properties

spring.batch.initializer.enabled=false



テーブルを使わせない方法

こちらの記事をどうぞ。

Spring Batch でメタテーブルを使いたくないのに使用されてしまう時はこうする

あるいは、自前でBatchConfigurerクラスを作ってしまってもいいかもしれません(自分は遠回りしたので作ってしまいました)。


MyBatchConfigurer.java

import javax.annotation.PostConstruct;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.configuration.BatchConfigurationException;
import org.springframework.batch.core.configuration.annotation.BatchConfigurer;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.explore.support.MapJobExplorerFactoryBean;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean;
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;

/**
* データベースなしのJobRepositoryを使う
*
*/

@Component
public class MyBatchConfigurer implements BatchConfigurer {

private static final Log LOG = LogFactory.getLog(MyBatchConfigurer.class);

private PlatformTransactionManager transactionManager;
private JobRepository jobRepository;
private JobLauncher jobLauncher;
private JobExplorer jobExplorer;

@PostConstruct
public void initialize() {
if (this.transactionManager == null) {
LOG.info("Create ResourceLessTransactionManager.");
this.transactionManager = new ResourcelessTransactionManager();
}

try {
MapJobRepositoryFactoryBean repoFactory
= new MapJobRepositoryFactoryBean(this.transactionManager);
repoFactory.afterPropertiesSet();
this.jobRepository = repoFactory.getObject();

MapJobExplorerFactoryBean explFactory
= new MapJobExplorerFactoryBean(repoFactory);
explFactory.afterPropertiesSet();

this.jobExplorer = explFactory.getObject();
this.jobLauncher = createJobLauncher();
} catch (Exception ex) {
LOG.fatal(ex.getMessage(), ex);
throw new BatchConfigurationException(ex);
}

}

protected JobLauncher createJobLauncher() throws Exception {
SimpleJobLauncher launcher = new SimpleJobLauncher();
launcher.setJobRepository(jobRepository);
launcher.afterPropertiesSet();
return launcher;
}

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

@Override
public PlatformTransactionManager getTransactionManager() throws Exception {
return transactionManager;
}

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

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



Spring Bootにまつわる落ち穂拾い


Batch Auto Configurationは無効にする?

無効にすると、作らなくちゃいけないクラスがいろいろ出てきたので、自分は有効にしました。


Data Source Auto Configuration有効でもOK?

Batch Configurerを自前で用意したのでOKみたいです。