Define an in-memory JobRepository

谁说我不能喝 提交于 2019-11-27 09:21:39

A few things here:

  1. If you have a DataSource configured in your ApplicationContext, by default Spring Batch will try to use it.
  2. In order to not use a DataSource when one is available within the ApplicationContext, you'll need to create your own BatchConfigurer. You can do that by extending the DefaultBatchConfigurer.
  3. Don't use the MapJobRepository except only for testing purposes. I has a number of issues (thread safety, etc) and is not recommended for production use. Use an in memory database like HSQLDB instead (you'll still need to create your own BatchConfigurer to do so).

With SpringBoot 2.x, the solution is simpler.

You have to extend the DefaultBatchConfigurer class like this:

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

Without datasource, the framework automatically switches to use the MapJobRepository.

Thank the comment of pvpkiran I've found my problem. It's necessary to define a JobLauncher bean.

Below an example:

@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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!