Squeak.ru - шаблоны программирования

Spring Batch - не записывать в файл (или удалять файл) в случае любого исключения

Можно ли не записывать данные в файл в случае наличия каких-либо исключений или как лучше всего удалить указанный файл в случае возникновения каких-либо ошибок?

В настоящее время я использую пользовательское средство записи, которое расширяет FlatFileItemWriter для записи данных, я столкнулся с проблемой, из-за которой проверка не выполняется в моем пользовательском процессоре, и я выбрасываю пользовательское исключение, а статус выхода шага помечен как FAILED, как и ожидалось, однако есть некоторые частичные данные в файле, в который я пишу, как требование, этот файл не может содержать частичные данные, это должны быть все данные, когда нет ошибок, если есть какие-либо ошибки, будь то в Читателе, Процессор или писатель, то файл вообще не должен создаваться.

Я не могу пропустить или отфильтровать запись, не прошедшую проверку, поскольку любые отсутствующие записи в этом файле будут считаться удаленными, что может быть не так.

Итак, как я могу убедиться, что любой файл, в который выполняется запись, будет удален в случае возникновения какой-либо ошибки в процессе шага?

Я нашел решение, которое кажется хакерским, в котором я реализую StepExecutionListener в своем писателе и делаю следующее:

this.errorDetected — это просто флаг в моем писателе, который устанавливается в значение true, когда какая-либо проверка не удалась.

    @Override
    ExitStatus afterStep(StepExecution stepExecution) {
        ExitStatus exitStatus;
        if (this.errorDetected || stepExecution.exitStatus == ExitStatus.FAILED) {
            if (this.fileImWritingTo.getFile().exists()) {
                this.fileImWritingTo.getFile().delete();
            }
            exitStatus = ExitStatus.FAILED.addExitDescription("Validation failed");
            return exitStatus;
        } else {
            return stepExecution.exitStatus;
        }
    }

Это хорошее решение? Или посоветуете что-то лучше?

Спасибо!

23.10.2020

  • Использование слушателя — один из вариантов. Другой вариант — использовать отдельные шаги, которые удаляют файл в случае сбоя предыдущего шага. 26.10.2020
  • Спасибо за совет! В моем случае кажется проще просто использовать прослушиватель, так как я могу легко передать ему ссылку на ресурс, который мне нужно удалить. Я хотел убедиться, что не существует такой опции, как shouldDeleteIfError, такой как существующая опция shouldDeleteIfExists для FlatFileItemWriter. 27.10.2020

Ответы:


1

как насчет «noSkip», я использовал с базой данных и работал нормально

@Bean
public Step step1(StepBuilderFactory stepBuilderFactory,
                  FlatFileItemWriter<Transaction> writer,
                  FlatFileItemReader<Transaction> reader) {
    return stepBuilderFactory.get("step1")
            .<Transaction, Transaction> chunk(5)
            .reader(reader)
            .processor(processor())
            .writer(writer)
            .faultTolerant()
            .noSkip(CustomException.class)
            .build();
}

Процессор примерно такой:

public class TransactionItemProcessor implements ItemProcessor<Transaction, Transaction> {
@Override
public Transaction process(Transaction transaction) throws Exception {
    if (transaction.getType().equals("fail")) {
        throw new CustomException();
    }
    return transaction;
}

}

И в определении потока задания создайте шаг очистки

 @Bean
public Job batchJob(JobBuilderFactory jobBuilderFactory,
                    Step cleanUpStep,
                    Step mainStep) {

    return jobBuilderFactory.get(BatchConstant.BATCH_NAME)
            .incrementer(new RunIdIncrementer())
            .flow(mainStep)
            .from(mainStep).on("FAILED").to(cleanUpStep)
            .end()
            .build();
}
24.10.2020
  • Спасибо, к сожалению, в моем случае это не работает, шаг действительно останавливается и не пропускает какие-либо элементы после того, как я создаю исключение. Основная проблема заключается в том, что я пишу кусками по 100, поэтому первые 100 записываются правильно, затем, когда я обрабатываю следующую партию из 100, я выбрасываю исключение, но первые 100, которые были обработаны правильно, никогда не откатываются. 27.10.2020
  • Возможно, вы можете добавить шаг очистки в статусе FAILED основного шага (я обновил код). Наверное, это немного чище. Если я прочитаю код, я не ожидаю, что слушатель выполнит чистый шаг, поэтому я знаю, что если основной шаг завершится ошибкой, будет выполнена задача очистки. 27.10.2020
  • Новые материалы

    Очистить файлы Program .cache в Ubuntu 20.10
    Очистите кеш за несколько простых шагов! GNU / Linux реализовал эффективное управление хранилищем для своих пользователей. Но заметили ли вы, что в вашей системе Linux заканчивается место,..

    Использование Node.js для чтения действительно больших файлов (часть 1)
    В этом сообщении в блоге есть интересный источник вдохновения. На прошлой неделе кто-то на одном из моих каналов в Slack опубликовал тестовое задание, которое он получил на должность..

    Введение в градиентный спуск и обратное распространение
    Введение в градиентный спуск и обратное распространение Как машинное обучение? Машинное обучение ( ML ) - это исследование компьютерных алгоритмов, которые автоматически улучшаются по..

    Шаблон CQRS — C#
    Этот архитектурный шаблон в основном говорит о том, что мы можем использовать одну модель для операций чтения, а другую — для операций записи. Звучит хорошо, но реализовать его может быть..

    Освоение функций потерь в машинном обучении для регрессии: полное руководство по оптимизации…
    Введение: Функция потерь является важным компонентом алгоритмов машинного обучения и статистических моделей. Его роль заключается в измерении несоответствия между прогнозируемым выходом модели и..

    10 языков программирования, которые изменят мир в 2023 году
    Мир программирования постоянно развивается, и востребованные языки постоянно меняются. Однако есть несколько языков, которые выдержали испытание временем и по-прежнему очень ценны для изучения в..

    Чем заняться в наших библиотеках (апрель 2023 г.)
    В апреле этого года мы празднуем обучение по-разному — от принятия позитивного и устойчивого мышления до понимания и сохранения местных популяций пчел, а также изучения новейших и новейших..