Пакет Spring с аннотациями и кешированием

Есть ли у кого-нибудь хороший пример Spring Batch (с использованием аннотации) для кеширования справочной таблицы, которая будет доступна для процессора?

Мне просто нужен простой кеш, запустите запрос, который возвращает некоторый byte [], и сохраните его в памяти до тех пор, пока задание не будет выполнено.

Благодарим за любую помощь по этой теме.

Спасибо !


person Jigar Naik    schedule 04.10.2018    source источник


Ответы (2)


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

Это означает, что данные правильно извлекаются из кеша. Вам нужно будет адаптировать образец для запроса базы данных и заполнения кеша (см. Комментарии в коде).

Надеюсь это поможет.

person Mahmoud Ben Hassine    schedule 04.10.2018
comment
Влияет ли это на возможность перезапуска задания, если я заменяю данные в кеше необходимыми данными для каждого шага. - person Prashant Shilimkar; 02.05.2019
comment
Есть ли способ применить данные чтения с несколькими потоками из 4 таблиц, каждая из которых содержит 10 записей lacs, а позже я хочу использовать их для встраивания в другой объект для создания окончательного объекта? Чтение каждой таблицы занимает 10 минут, поэтому я хочу ускорить этот процесс. Есть какие-нибудь указания по этому поводу? - person user4567570; 19.05.2020

Вы можете использовать ehcache-jsr107 implementation. Очень быстро настраивается. Пример интеграции Spring и ehcache доступен здесь. Вы также должны иметь возможность настроить то же самое с весенней партией.

Надеюсь, это хлэпс

person Niraj Sonawane    schedule 04.10.2018