SpringBatch пишет в разные объекты - PullRequest
0 голосов
/ 08 мая 2020

Я обработал объект-оболочку (в данном случае AimResponse).

В зависимости от свойства «тип» я сопоставляю объект Document или SourceSpace.

Затем мне нужно сохранить эти сущности. Я нашел пример, похожий на этот:

@Override
public void write(List<? extends List<AimResponse>> list)
    throws Exception {
    List<SourceSpace> sourceSpaces = new ArrayList<>();
    List<Document> documents = new ArrayList<>();
    for(List<AimResponse> item:list) {
        for(AimResponse i:item) {
            if(i.getType().indexOf("folder") >= 0) {
                SourceSpace sourceSpace = Mapper.aimResponseToSourceSpace(i);
                sourceSpace.setStatus(Status.FOUND.name());
                sourceSpaces.add(sourceSpace);
            } else if(i.getType().indexOf("document") >= 0) {
                Document document = Mapper.aimResponseToDocument(i);
                document.setStatus(Status.FOUND.name());
                documents.add(document);
            }
        }
    }
    if(!CollectionUtils.isEmpty(sourceSpaces)) {
        sourceSpaceWriter.write(sourceSpaces);
    }
    if(!CollectionUtils.isEmpty(documents)) {
        documentWriter.write(documents);
    }
    }

В этом примере я не могу создать экземпляр JdbcBatchItemWriter, но в любом случае, я думаю, было бы лучше, если бы процессор мог разделиться на 2 разных списка и вызвать 2 разных писателя у каждого свой тип, но я думаю, это невозможно.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 11 мая 2020

ClassifierCompositeItemWriter - это то, что вы ищете. Это позволяет вам классифицировать элементы в соответствии с заданными критериями и вызывать соответствующего писателя.

В вашем случае вы можете классифицировать элементы на основе их типа (i.getType()) и использовать писатель для каждого типа. Вы можете найти пример того, как использовать этот писатель здесь .

...