SpringBootを使用してSpringBatchをテストしています。 Oracleデータベースで動作するジョブを定義する必要がありますが、このDB内にジョブとステップの状態を保存したくありません。 MapJobRepositoryFactoryBeanでメモリ内リポジトリを使用できるドキュメントを読みました。
次に、このBeanを実装しました。
@Bean
public JobRepository jobRepository() {
MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean(new ResourcelessTransactionManager());
try {
JobRepository jobRepository = factoryBean.getObject();
return jobRepository;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
しかし、私の仕事が始まると、Spring Batchが最初に行うことは、Oracle DBにテーブルを作成し、Oracleデータソースを引き続き使用することです。 JobRepositoryの定義が考慮されていないようです。
私は何を取りこぼしたか ?
[〜#〜] edit [〜#〜]:Spring Boot1.5.3とSpringBatch3.0.7を使用しています
SpringBoot 2.xを使用すると、ソリューションがより簡単になります。
DefaultBatchConfigurer
クラスを次のように拡張する必要があります。
@Component
public class NoPersistenceBatchConfigurer extends DefaultBatchConfigurer {
@Override
public void setDataSource(DataSource dataSource) {
}
}
データソースがない場合、フレームワークは自動的にMapJobRepository
を使用するように切り替わります。
ここにいくつかのことがあります:
DataSource
にApplicationContext
が設定されている場合、デフォルトではSpringBatchがそれを使用しようとします。DataSource
内で使用可能な場合にApplicationContext
を使用しないようにするには、独自のBatchConfigurer
を作成する必要があります。 DefaultBatchConfigurer
を拡張することでそれを行うことができます。MapJobRepository
を使用しないでください。いくつかの問題(スレッドセーフなど)があり、本番環境での使用はお勧めしません。代わりに、HSQLDBなどのインメモリデータベースを使用してください(これを行うには、独自のBatchConfigurer
を作成する必要があります)。Pvpkiranのコメントに感謝します。問題が見つかりました。 JobLauncherBeanを定義する必要があります。
例の下:
@Bean
public JobRepository jobRepository() {
MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean(new ResourcelessTransactionManager());
try {
JobRepository jobRepository = factoryBean.getObject();
return jobRepository;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Bean
public JobLauncher jobLauncher(JobRepository jobRepository) {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository);
return jobLauncher;
}
Spring Bootと@EnableBatchProcessingを使用する場合は、DefaultBatchConfigurerを拡張し、createJobRepositoryメソッドをオーバーライドします。 MapJobRepositoryFactoryBeanを使用してResourcelessTransactionManagerとJobRepositoryを作成します。残りのBeanは、SpringBootによって自動作成されます。
@Configuration
public class InMemoryBatchContextConfigurer extends DefaultBatchConfigurer {
@Bean
private ResourcelessTransactionManager resoucelessTransactionManager() {
return new ResourcelessTransactionManager();
}
@Override
protected JobRepository createJobRepository() throws Exception {
MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean();
factoryBean.setTransactionManager(resoucelessTransactionManager());
return factoryBean.getObject();
}
}`