有没有人有很好的Spring Batch(使用批注)示例来缓存可供处理器访问的参考表?
我只需要一个简单的缓存,运行一个查询,该查询返回一些byte []并将其保留在内存中,直到执行作业。
感谢有关此主题的任何帮助。
谢谢 !
JobExecutionListener可以使用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
这意味着可以从缓存中正确检索数据。您将需要调整样本以查询数据库并填充缓存(请参见代码中的注释)。
希望这可以帮助。