Добавить несколько запросов на обновление в весеннем пакете JdbcBatchItemWriter

Мне нужно запустить обновление для двух таблиц на основе данных, полученных в моем файле. Источник - один-единственный файл.

Я попытался найти 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 запускают обновление, и мне нужно получить счетчик обновлений для обоих запросов.

Это просто я работаю, я выяснил, но я думаю, что это недостаточно оптимально

Пожалуйста, дайте мне знать, можем ли мы использовать несколько запросов на обновление в одном писателе. Также предложите, если какой-либо оптимальный способ.

Спасибо

Используйте CompositeItemWriter, состоящий из двух разных JdbcBatchItemWriter , по одному для каждого запроса, который вам нужно выполнить.

Luca Basso Ricci 03.05.2018 09:19

@LucaBassoRicci, спасибо за ответ, я попробовал подход, но как нам получить количество обновлений для каждого писателя

Ashish Shetkar 04.05.2018 08:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
1 032
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете подойти к проблеме декорирования 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 из контекста выполнения шага, но он дает мне счет для всего шага, а не для каждого элемента - обновить

Ashish Shetkar 04.05.2018 12:00

Если delegate.write() завершился успешно, вы уверены, что записали items.size(); если запись вызывает исключение, SB откатывает все и перезапускает последний фрагмент с помощью commit-interval=1.

Luca Basso Ricci 04.05.2018 12:16

извините за позднее замечание, да, это было полезно для меня

Ashish Shetkar 24.05.2018 12:20

Другие вопросы по теме