Передача данных от одного писателя другому писателю после чтения из БД - PullRequest
0 голосов
/ 27 марта 2020

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

Reader (DB1) - data1 -> Процессор - - data2 -> Writer (DB2) - data3 -> Writer (Solace Publisher)

Я использую spring boot-2.2.5.RELEASE и spring-boot-starter-batch.

Я создал задание, состоящее из 1 шага, который считывает данные из DB1 и записывает данные в DB2 через RepositoryItemReader и RepositoryItemWriter соответственно. Это работает нормально.

Теперь следующая задача - отправить сохраненные данные с сгенерированным идентификатором в поток утешения (используя spring-cloud-starter-stream-solace).

У меня есть следующие вопросы. Пожалуйста, помогите, так как я совсем новичок в весенней партии

Как я могу получить полную запись после ее сохранения в DB2 на основе какого-либо параметра? Нужно ли мне писать свой собственный RepositoryItemWriter, имеющий контекст StepExecution, или я могу каким-то образом использовать существующий RepositoryItemWriter.

Как только я получил запись, мне нужно использовать поток утешения, и там у меня есть метод publi sh, который ожидает аргумент ( запись) будет опубликовано. Я снова думаю, что мне нужно написать свой собственный Item Writer, и я мог бы использовать запись, переданную из вышеупомянутого repositoryItemWriter StepExecutionContext, или я должен запросить непосредственно в DB2 отсюда на основе какого-либо параметра?

Любой из приведенных выше случаев I нужно использовать контекст stepexecution, но могу ли я использовать доступный RepositoryItemWriter или мне нужно написать свой собственный?

Есть ли какая-либо другая концепция, которая пригодится в этом удобстве вместо использования вышеуказанных подходов?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Передача данных на будущие этапы является распространенным явлением в Spring Batch. Согласно документации https://docs.spring.io/spring-batch/docs/current/reference/html/common-patterns.html#passingDataToFutureSteps вы можете использовать stepExecution для хранения и получения сгенерированных идентификаторов. В вашем случае авторы также являются слушателями, у которых до шага есть методы, помеченные @BeforeStep. Например:

public class DB2ItemWriter implements ItemWriter<Object> {
    private StepExecution stepExecution;

    public void write(List<? extends Object> items) throws Exception {
        // ...

        ExecutionContext stepContext = this.stepExecution.getExecutionContext();
        stepContext.put("generatedIds", ids);
    }

    @BeforeStep
    public void saveStepExecution(StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }
}

, а затем вы получаете идентификаторы в следующем писателе

public class SolacePublisherItemWriter implements ItemWriter<Object> {

    public void write(List<? extends Object> items) throws Exception {
        // ...
    }

    @BeforeStep
    public void retrieveGeneratedIds(StepExecution stepExecution) {
        ExecutionContext stepExecutionContext = stepExecution.getExecutionContext();
        this.generatedIds = stepExecutionContext.get("generatedIds");
    }
}
0 голосов
/ 30 марта 2020

Я создал задание, состоящее из одного шага, который считывает данные из DB1 и записывает данные в DB2 через RepositoryItemReader и RepositoryItemWriter соответственно. Это работает нормально.

Я бы добавил второй шаг, который считывает данные из таблицы (в которой записи были сохранены на шаге 1 и генерируются их идентификаторы) и pu sh, чтобы утешить используя собственный писатель.

...