#spring-data #spring-batch
Вопрос:
Я пытаюсь настроить Spring Batch
перемещение записей базы данных из Oracle
ежедневной в Cassandra
ежедневную.
Я знаю, что могу вручную определить запросы репозитория JPA на основе дополнительной таблицы сущностей (например, MyBatchProgress, где я храню ранее завершенную Id
дату или что-то в этом роде), чтобы следующее пакетное задание знало, с какой сущности начинать дальнейшие операции.
Мой вопрос: предоставляет ли Spring Batch что-то подобное встроенному (также с использованием Spring Data JPA)?
Или это то, что я должен написать вручную на шаге чтения заданий, где я просто забираю last Id
данные, хранящиеся в моей пользовательской таблице «прогресс»?
Заранее спасибо!
Комментарии:
1. Вам нужно будет сохранить последний обработанный идентификатор где-нибудь (в таблице базы данных), если это требуется при каждом запуске задания, чтобы задание знало, с чего оно должно начинаться. Предполагая, что ваше задание запускается по таймеру, таймер может найти значение этого идентификатора и запустить задание, передав последний обработанный идентификатор в качестве параметра задания.
2. @httPants это то, что я сейчас делаю вручную. Я думал, что это было что-то тривиальное и будет включено в весеннюю партию. Проблема, с которой я сталкиваюсь, заключается в том, что интерфейс *Reader имеет одну сущность в качестве парама, в то время как *Writer принимает список. Я не уверен, как Spring Batch запишет этот последний идентификатор последней записи, с которой он работал, и если шаг чтения будет правильно его подобран…
Ответ №1:
Вы можете сохранить последний идентификатор в контексте выполнения, который сохраняется в таблицах метаданных. С учетом этого вы можете заставить код, запускающий задание, искать последнее выполнение задания, извлекать идентификатор из его контекста и передавать его в качестве параметра задания следующему экземпляру задания.
Комментарии:
1. Спасибо! что делать, если я хочу знать идентификатор предыдущей транзакции внутри задания. Внутри задания может быть 1…. n транзакций. Мне нужно запросить эту транзакцию. Я мог бы использовать встроенный в Spring Batch IdIncrementor(), но я не уверен, что это полностью соответствует моим потребностям.
2. Что вы подразумеваете под идентификатором предыдущей транзакции и запросом этой транзакции? О какой транзакции вы говорите? Механизм хранения, который вы ищете, на мой взгляд, является контекстом выполнения (если вы не хотите хранить данные о ходе выполнения в другом месте), поэтому вы можете поместить в контекст все, что хотите, и использовать его по мере необходимости для запуска следующего выполнения.
3. ИДЕНТИФИКАТОР предыдущей транзакции = идентификатор ранее обработанной сущности / единицы / элемента внутри определенного шага. Мое мнение состояло в том, что пакет spring хранит значения внутри контекста, которые являются результатом всего шага, а не тем, что может быть сохранено внутри шага как результат выполнения шага…
4. Существует два уровня контекстов выполнения: контекст выполнения шага и контекст выполнения задания. Оба они сохраняются в базе данных (в разных таблицах). Вам решать, где хранить информацию, необходимую для следующего запуска.
5. хорошо, тогда контекст выполнения шага, если он сохраняется также во время выполнения шага, может быть именно тем, что мне нужно! Спасибо!