web-dev-qa-db-ja.com

インメモリJobRepositoryを定義する

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を使用しています

6
ChriX

SpringBoot 2.xを使用すると、ソリューションがより簡単になります。

DefaultBatchConfigurerクラスを次のように拡張する必要があります。

@Component
public class NoPersistenceBatchConfigurer extends DefaultBatchConfigurer {
    @Override
    public void setDataSource(DataSource dataSource) {
    }
}

データソースがない場合、フレームワークは自動的にMapJobRepositoryを使用するように切り替わります。

7
ChriX

ここにいくつかのことがあります:

  1. DataSourceApplicationContextが設定されている場合、デフォルトではSpringBatchがそれを使用しようとします。
  2. DataSource内で使用可能な場合にApplicationContextを使用しないようにするには、独自のBatchConfigurerを作成する必要があります。 DefaultBatchConfigurerを拡張することでそれを行うことができます。
  3. テスト目的のみを除いて、MapJobRepositoryを使用しないでください。いくつかの問題(スレッドセーフなど)があり、本番環境での使用はお勧めしません。代わりに、HSQLDBなどのインメモリデータベースを使用してください(これを行うには、独自のBatchConfigurerを作成する必要があります)。
7
Michael Minella

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;
}
3
ChriX

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();
    }
}`
0
saa2k15