Мне нужно запустить обновление для двух таблиц на основе данных, полученных в моем файле. Источник - один-единственный файл.
Я попытался найти JdbcBatchItemWriter с несколькими запросами.
В настоящее время я пробовал следующий подход с 1 заданием и 2 этапами - где я использую один и тот же считыватель, тот же процессор и тот же слушатель на обоих этапах - но я думаю, что он повторяется.
<batch:job id = "batchJob">
<batch:step id = "step1" next = "step2">
<batch:tasklet>
<batch:chunk reader = "cvsFileItemReader" processor = "myItemProcessor"
writer = "mysqlItemWriter1" commit-interval = "1" skip-limit = "10">
<batch:listeners>
<batch:listener ref = "stepListener">
</batch:listener>
</batch:listeners>
</batch:chunk>
</batch:tasklet>
</batch:step>
<batch:step id = "step2">
<batch:tasklet>
<batch:chunk reader = "cvsFileItemReader" processor = "myItemProcessor"
writer = "mysqlItemWriter2" commit-interval = "1" skip-limit = "10">
<batch:listeners>
<batch:listener ref = "stepListener">
</batch:listener>
</batch:listeners>
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
Мои itemWriter1 и 2 запускают обновление, и мне нужно получить счетчик обновлений для обоих запросов.
Это просто я работаю, я выяснил, но я думаю, что это недостаточно оптимально
Пожалуйста, дайте мне знать, можем ли мы использовать несколько запросов на обновление в одном писателе. Также предложите, если какой-либо оптимальный способ.
Спасибо
@LucaBassoRicci, спасибо за ответ, я попробовал подход, но как нам получить количество обновлений для каждого писателя




Вы можете подойти к проблеме декорирования JdbcBatchItemWriter: этот декоратор отвечает за хранение в ExecutionContext того, сколько элементов на самом деле записывает настоящий писатель, чтобы вы могли вернуться к ним позже на своем этапе.
class CountingItemWriter implements ItemStreamWriter {
private JdbcBatchItemWriter delegate;
private int count = 0;
private final String id;
CountingItemWriter(String id) {
this.id = "CountingItemWriter#"+id;
}
write(List<?> items) {
delegate.write(items);
count += items.size();
}
open(ExecutionContext ec) {
count = getInt(this.id, 0);
}
update(ExecutionContext ec) {
ec.putInt(this.id, count);
}
close() {
// no-op
}
}
Не забудьте указать другой id, если у вас более одного записывающего устройства, чтобы иметь возможность получить правильный счетчик для каждого записывающего устройства.
спасибо за ваш ответ, мне нужно количество строк, обновленных моим запросом sql в каждом писателе или каждой таблице, как я упоминал ранее, я думаю, что количество, которое вы мне дали, даст количество элементов, я попытался использовать writeCount из контекста выполнения шага, но он дает мне счет для всего шага, а не для каждого элемента - обновить
Если delegate.write() завершился успешно, вы уверены, что записали items.size(); если запись вызывает исключение, SB откатывает все и перезапускает последний фрагмент с помощью commit-interval=1.
извините за позднее замечание, да, это было полезно для меня
Используйте
CompositeItemWriter, состоящий из двух разныхJdbcBatchItemWriter, по одному для каждого запроса, который вам нужно выполнить.