У меня есть существующий весенний пакетный проект, который имеет несколько шагов Я хочу изменить шаг, чтобы остановить работу: jobExecution.getStatus() == STOPPED
.
Мой шаг:
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
private StepReader reader;
@Autowired
private StepProcessor processor;
@Autowired
private StepWriter writer;
@Autowired
public GenericListener listener;
@Bean
@JobScope
@Qualifier("mystep")
public Step MyStep() throws ReaderException {
return stepBuilderFactory.get("mystep")
.reader(reader.read())
.listener(listener)
.processor(processor)
.writer(writer)
.build();
}
GenericListener
реализует ItemReadListener, ItemProcessListener, ItemWriteListener
и переопределяет методы до и после, которые в основном пишут журнал.
Основное внимание здесь уделяется классу StepReader
и его read()
методу, который возвращает FlatFileItemReader
:
@Component
public class StepReader {
public static final String DELIMITER = "|";
@Autowired
private ClassToAccessProperties classToAccessProperties;
private Logger log = Logger.create(StepReader.class);
@Autowired
private FlatFileItemReaderFactory<MyObject> flatFileItemReaderFactory;
public ItemReader<MyObject> read() throws ReaderException {
try {
String csv = classToAccessProperties.getInputCsv();
FlatFileItemReader<MyObject> reader = flatFileItemReaderFactory.create(csv, getLineMapper());
return reader;
} catch (ReaderException | EmptyInputfileException | IOException e) {
throw new ReaderException(e);
} catch (NoInputFileException e) {
log.info("Oh no !! No input file");
// Here I want to stop the job
return null;
}
}
private LineMapper<MyObject> getLineMapper () {
DefaultLineMapper<MyObject> mapper = new DefaultLineMapper<>();
DelimitedLineTokenizer delimitedLineTokenizer = new DelimitedLineTokenizer();
delimitedLineTokenizer.setDelimiter(DELIMITER);
mapper.setLineTokenizer(delimitedLineTokenizer);
mapper.setFieldSetMapper(new MyObjectFieldSetMapper());
return mapper;
}
}
Я пытался реализовать StepExecutionListener
в StepReader
, но безуспешно, я думаю, потому что метод reader
в StepBuilderFactory
ожидает ItemReader
от метода reader.read()
, и ему все равно остальная часть класса.
Я ищу идеи или решение, чтобы иметь возможность остановить всю работу (не подвести ее), когда пойман NoInputFileException
.