Я расширяю это Как Spring Batch CompositeItemWriter управляет транзакциями для авторов делегатов? вопрос здесь:
В моем случае у меня ниже CompositeItemWriter
, который записывает данные в несколько таблицы той же базы данных, перед записью данных он преобразует данные, реализуя различные бизнес-правила. Здесь одна запись может удовлетворять разным бизнес-правилам и т. Д. c. Следовательно, один писатель может получить больше данных, чем другие.
@Bean
public CompositeItemWriter<Employee> EmployeeCompositeWriter() throws Exception {
List<ItemWriter<? super Employee>> employee = new ArrayList<>();
employee.add(employeeWriter());
employee.add(departmentWriter());
employee.add(stockWriter());
employee.add(purchaseWriter());
CompositeItemWriter<Employee> compositeItemWriter = new CompositeItemWriter<>();
compositeItemWriter.setDelegates(employee);
compositeItemWriter.afterPropertiesSet();
return compositeItemWriter;
}
Сценарий - Предположим, 1-й писатель работает очень хорошо, 2-й писатель генерирует исключение, тогда 3-й и 4-й писатели не получают вызова, это что Automic
характер по умолчанию в Spring Batch происходит из-за отката транзакции.
Здесь, даже если какое-либо исключение возникает во 2-м писателе, я хочу успешно вызвать 3-й и 4-й писатели и сохранить данные, я также хотел успешно сохранить данные 1-го писателя и 2-го писателя ... только данные исключения, которые я хочу сохранить в таблице ошибок с помощью SkipListener
, чтобы определить, какие записи были нежелательными или мусорными.
Решение - Чтобы достичь вышеупомянутого сценария , мы добавили @Transactional(propagation = Propagation.REQUIRES_NEW)
для каждого метода записи писателей, первый писатель сохранил данные сейчас, а второй писатель генерирует исключение (используя namedJdbcTemplate.batchUpdate()
для массового обновления данных), мы кэшируем его и повторно выбрасывая его, но мы могли видеть, что уровень фиксации снижен до 1 (отклонение от курса для определения точной записи мусора) и мама Исключение ent возникает из-за 2-го писателя, снова вызывается 1-й писатель, и он сохраняет повторяющиеся данные, и вызываются писатели 2-й, 3-й и 4-й, но также эта нежелательная запись не поступает на 3-й и 4-й писатели.
Здесь Я не хочу, чтобы все пакетное задание останавливалось, если одна или несколько записей являются мусором, потому что это задание критически важно для нас, чтобы запускать его каждый раз. Есть ли способ сохранить все данные там, где исключение не возникает, и только сохранить данные исключения в таблице ошибок с помощью SkipListener
, если возможно, или любым другим способом?
Есть ли способ можем ли мы повторно использовать компоненты пакета, такие как (ЧИТАТЕЛЬ или ПРОЦЕССОР) любого шага, на другом шаге?