有没有人有很好的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
这意味着可以从缓存中正确检索数据。您将需要调整样本以查询数据库并填充缓存(请参见代码中的注释)。
希望这可以帮助。
我想将主数据缓存到Redis。 所以,我写了这些代码。 和 和ymlfile 但是,缓存不工作... 无论何时调用printTest方法,都将执行“getTest”方法。Redis没有数据。。。我的代码中有什么问题? SpringBoot版本是1.4.0 依赖关系是
我发现了很多关于禁用Thymeleaf for development模板缓存的帖子,但我无法让它正常工作。我的堆栈: Spring靴1.5。7 Spring靴开发工具 百里香 IntelliJ IDEA Ultimate 2017.2 我不需要自动重建:我已经将IntelliJ中的“重建”命令映射到“恢复”命令,这对于热交换Java类非常有效。然而,css和html模板仍然只显示更改,如果我重新
我有一个用@Cacheable注释的方法。如果在方法内部捕获了异常,我希望清除缓存。但是,缓存似乎是在清除缓存的行之后执行的方面中加载的。因此,当在方法中捕获异常时,即使清除了缓存,空字符串结果仍保留在缓存中。 我应该从哪里清除缓存?
问题内容: 这与Spring 在服务层上使用 注释有关。 我经历了很多关于此的堆栈溢出问题,但是仍然对是否应该避免使用感到困惑。 如果有人帮助我找出以下查询的答案,那将是很大的帮助。 在具有复杂模式的应用程序中使用是不好的做法。 使用此过滤器可能会导致问题 如果我们正在使用,是否意味着不需要? 下面是我的Spring配置文件 问题答案: 是一个servlet过滤器,而不仅仅是打开一个hiberna
我有一个带有guice但没有spring的应用程序。我有: 我有两个实现: 我希望能够将缓存服务注入所有其他服务,并且希望在缓存服务中注入正常服务。问题是,当我想在其他类中注入服务接口时,实现是随机选择的。有没有办法解决这个问题?