предварительная обработка в загрузочной партии с несколькими потоками - PullRequest
0 голосов
/ 25 июня 2018

У меня есть пакет Spring с многопоточностью. В моем процессоре я хочу использовать глобальные переменные, скажем, карту. Карта содержит некоторые значения, которые должны запрашиваться из таблицы и использоваться процессором. Как мне этого добиться? Если я напишу логику для установки карты в процессоре, запрос будет выполняться для каждой записи, извлекаемой устройством чтения элементов, которое будет иметь миллионы чисел. Есть ли способ сделать это?

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете перехватить выполнение шага

Пружинная партия - справочная документация, раздел 5.1.10. Перехват выполнения шага

Например, вы можете реализовать интерфейс StepExecutionListener

@Component
@JobScope
public class Processor implements ItemProcessor<Integer,Integer>, StepExecutionListener {

    private final Map<String,String> map = new HashMap<>();

    @Override
    public void beforeStep(StepExecution stepExecution) {
        // initialize a variable once before step
        map.put("KEY","VALUE");
    }

    @Override
    public Integer process(Integer item) throws Exception {
        // use a variable for each iteration
        final String key = map.get("KEY");
        // ...
    }

    // ....
}

или используйте аннотацию @BeforeStep

@Component
@JobScope
public class Processor implements ItemProcessor<Integer,Integer>{

    private final Map<String,String> map = new HashMap<>();

    @BeforeStep
    public void beforeStep(StepExecution stepExecution) {
        // initialize a variable once before step
        map.put("KEY","VALUE");
    }

    @Override
    public Integer process(Integer item) throws Exception {
        // use a variable for each iteration
        final String key = map.get("KEY");
        //...
    }
}
...