Проверка пакетной задачи Springboot

Я использую весенние пакетные задачи с opencsv для обработки некоторых файлов csv. После чтения файлов в память на шаге 1, на шаге 2 я хочу выполнить некоторую проверку. Я не уверен, каким будет правильный подход при настройке проверки. Я использую следующий код.

public class PrimaryCareValidation  implements Tasklet, StepExecutionListener {

    private final Logger logger = LoggerFactory.getLogger(PrimaryCareProcessor.class);

    private List<PrimaryCareDTO> batch;

    @Autowired
    private Validator validator;

    @Override
    public void beforeStep(StepExecution stepExecution) {
        logger.info("PrimaryCare validation initialized.");

        ExecutionContext executionContext = stepExecution
                .getJobExecution()
                .getExecutionContext();
        this.batch = (List<PrimaryCareDTO>) executionContext.get("PrimaryCareDTO");
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        logger.info("PrimaryCare validation ended.");
        return ExitStatus.COMPLETED;    }

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        logger.info("PrimaryCare execute.");

        for (PrimaryCareDTO pcDTO : batch) {
            DataBinder binder = new DataBinder(pcDTO); 

            Set<ConstraintViolation<PrimaryCareDTO>> violations = validator.validate(pcDTO);

            for (ConstraintViolation<PrimaryCareDTO> violation : violations)
            {
                String propertyPath = violation.getPropertyPath().toString();
                String message = violation.getMessage();

                result.addError(new FieldError("employee",propertyPath,

                        "Invalid "+ propertyPath + "(" + message + ")"));
            }

        }

        return RepeatStatus.FINISHED;    }
}

Каков наилучший способ проверить весь список DAO и добавить сообщения в объект сообщения, чтобы позже вернуться к шагу 3?


person Code Junkie    schedule 10.09.2018    source источник
comment
Есть ли что-то, что мешает вам использовать шаг, ориентированный на фрагменты, а не тасклет? Я спрашиваю, потому что проверка является типичным случаем использования обработчика элементов, поэтому вы можете реализовать свою проверку в обработчике элементов на уровне элемента (если только ваша логика проверки не является перекрестной и не требует всего списка, но это не кажется случае в соответствии с вашим кодом). Если вы можете использовать обработчик элементов, то возможным способом будет использование ItemProcessListener и запись недопустимых элементов куда-нибудь, которые будет читать шаг 3.   -  person Mahmoud Ben Hassine    schedule 10.09.2018
comment
Да, есть перекрестная проверка, и я полагаю, что вы, возможно, помогли мне с этим пару недель назад. Я просто новичок в springboot и хочу делать все по-весеннему.   -  person Code Junkie    schedule 11.09.2018
comment
Использование JobExecutionDecider может быть лучшим решением, чем тасклет   -  person Luca Basso Ricci    schedule 11.09.2018


Ответы (1)


У меня был очень похожий случай, и я использовал для этого библиотеку vavr. Он содержит полезный объект Validation, который может содержать либо успешное значение - в вашем случае это DTO, либо в случае неудачи - какое-то сообщение. Кроме того, есть встроенные методы, которые могут помочь вам сжать их в один агрегированный Validation.

Пожалуйста, обратите внимание на то, что @Mahmoud отметил в комментариях. Лучше использовать считыватель-запись-процессор, в этом случае он оставит меньший объем памяти и может быть масштабируемым.
Прямо сейчас у вас есть риск иметь большой файл, который не поместится в памяти вашего приложения.

То же самое относится к вашим объектам DTO. Они останутся в памяти, если тасклет не завершит работу. Это риск иметь OutOfMemoryException

Ознакомьтесь с этой статьей: https://www.baeldung.com/vavr-validation-api

person Igor Konoplyanko    schedule 10.09.2018
comment
Я бы использовал куски, но для перекрестной проверки нескольких файлов я должен использовать тасклеты. Я знаю о потенциальных проблемах с памятью, но в моем случае в CSV никогда не бывает более нескольких тысяч строк, что делает проблемы с памятью несуществующими. Ваше предложение по-прежнему использует аннотации проверки свойств (@NotNull ect)? - person Code Junkie; 11.09.2018