代码之家  ›  专栏  ›  技术社区  ›  Jigar Naik

带注释和缓存的Spring批处理

  •  1
  • Jigar Naik  · 技术社区  · 7 年前

    有没有人有springbatch(使用注释)缓存一个处理器可以访问的引用表的好例子?

    我只需要一个简单的缓存,运行一个返回字节[]的查询,并将其保存在内存中,直到作业执行为止。

    感谢您对这个话题的帮助。

    谢谢!

    2 回复  |  直到 7 年前
        1
  •  5
  •   Mahmoud Ben Hassine    5 年前

    A JobExecutionListener

    举个例子:

    import org.springframework.batch.core.Job;
    import org.springframework.batch.core.JobExecution;
    import org.springframework.batch.core.JobExecutionListener;
    import org.springframework.batch.core.JobParameters;
    import org.springframework.batch.core.Step;
    import org.springframework.batch.core.StepContribution;
    import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
    import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
    import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
    import org.springframework.batch.core.launch.JobLauncher;
    import org.springframework.batch.core.scope.context.ChunkContext;
    import org.springframework.batch.core.step.tasklet.Tasklet;
    import org.springframework.batch.repeat.RepeatStatus;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.CacheManager;
    import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableBatchProcessing
    public class MyJob {
    
        private JobBuilderFactory jobs;
    
        private StepBuilderFactory steps;
    
        public MyJob(JobBuilderFactory jobs, StepBuilderFactory steps) {
           this.jobs = jobs;
           this.steps = steps;
        }
    
        @Bean
        public CacheManager cacheManager() {
            return new ConcurrentMapCacheManager(); // return the implementation you want
        }
    
        @Bean
        public Tasklet tasklet() {
            return new MyTasklet(cacheManager());
        }
    
        @Bean
        public Step step() {
            return steps.get("step")
                    .tasklet(tasklet())
                    .build();
        }
    
        @Bean
        public JobExecutionListener jobExecutionListener() {
            return new CachingJobExecutionListener(cacheManager());
        }
    
        @Bean
        public Job job() {
            return jobs.get("job")
                    .start(step())
                    .listener(jobExecutionListener())
                    .build();
        }
    
        class MyTasklet implements Tasklet {
    
            private CacheManager cacheManager;
    
            public MyTasklet(CacheManager cacheManager) {
                this.cacheManager = cacheManager;
            }
    
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                String name = (String) cacheManager.getCache("referenceData").get("foo").get();
                System.out.println("Hello " + name);
                return RepeatStatus.FINISHED;
            }
        }
    
        class CachingJobExecutionListener implements JobExecutionListener {
    
            private CacheManager cacheManager;
    
            public CachingJobExecutionListener(CacheManager cacheManager) {
                this.cacheManager = cacheManager;
            }
    
            @Override
            public void beforeJob(JobExecution jobExecution) {
                // populate cache as needed. Can use a jdbcTemplate to query the db here and populate the cache
                cacheManager.getCache("referenceData").put("foo", "bar");
            }
    
            @Override
            public void afterJob(JobExecution jobExecution) {
                // clear cache when the job is finished
                cacheManager.getCache("referenceData").clear();
            }
        }
    
        public static void main(String[] args) throws Exception {
            ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
            JobLauncher jobLauncher = context.getBean(JobLauncher.class);
            Job job = context.getBean(Job.class);
            jobLauncher.run(job, new JobParameters());
        }
    
    }
    

    执行时,它会打印:

    Hello bar
    

    这意味着从缓存中正确检索数据。您需要调整示例以查询数据库并填充缓存(请参见代码中的注释)。

        2
  •  2
  •   Niraj Sonawane    7 年前

    ehcache-jsr107 implementation. 安装起来很快。 Spring和ehcache集成示例可用 here .

    希望这一切顺利