带批注和缓存的Spring Batch

有没有人有很好的Spring Batch(使用批注)示例来缓存可供处理器访问的参考表?

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

感谢有关此主题的任何帮助。

谢谢 !

回答:

JobExecutionListener可以使用A 在执行作业之前用参考数据填充高速缓存,并在作业完成后清除高速缓存。

这是一个例子:

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

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

希望这可以帮助。

以上是 带批注和缓存的Spring Batch 的全部内容, 来源链接: utcz.com/qa/418977.html

回到顶部