Spring Batch Boot - записывать данные в несколько мест на основе кода состояния при чтении данных из CSV? - PullRequest
0 голосов
/ 19 декабря 2018

Я разрабатываю Spring Boot Batch пример.В этом примере, считывая данные из CSV и основываясь на значениях кода состояния (например, SUCCESS, REJECT, PENDING, COMPLETED), я хочу записать их в 4 разных места (MySQL, XML, Postgres, Salesforce DB) пока пишешь?Я вижу, что мы можем передать только 1 тип списка из Customers в CompositeItemWriter метод.Как я могу передать 4 различных Customer списка в CompositeItemWriter?

Здесь я мог бы подумать об использовании CompositeItemProcessor и CompositeItemWriterCompositeItemProcessor я приму решение разделить записи во всех этих процессорах, и теперь вопрос в том, как я могу передать SUCCESS в MYSQL, REJECT в XML, PENDING в Postgresи от COMPLETED до Salesforce DB?

@Bean
public CompositeItemProcessor<Customer, Customer> compositeItemProcessor() throws Exception{
    List<ItemProcessor<Customer, Customer>> delegates = new ArrayList<>();
    delegates.add(new FilteringSuccessProcessor());
    delegates.add(new FilteringRejectProcessor());
    delegates.add(new FilteringPendingProcessor());
    delegates.add(new FilteringCompletedProcessor());

    CompositeItemProcessor<Customer, Customer> processor = new CompositeItemProcessor<>();
    processor.setDelegates(delegates);
    processor.afterPropertiesSet();

    return processor;
}

FilteringSuccessProcessor.java

Как я создал процессор, все коды состояния и

public class FilteringSuccessProcessor implements ItemProcessor<Customer, Customer> {

    @Override
    public Customer process(Customer item) throws Exception {
        if(item.getStatus == "SUCCESS"){
            return item;
        }
        else
            return null;
    }
}

Теперь мой вопрос: как мы можем передать 4 разных результата данных в CompositeItemWriter, чтобы записать их в 4 разных места?

Я хотя и использую CustomerClassifier, но как передать четыре разных спискаодному и тому же писателю?

Есть указания?Это очень интересный вариант использования, но для реализации он выглядит критически важным.

1 Ответ

0 голосов
/ 19 декабря 2018

вы можете использовать classifierCompositeItemWriter и определить свою политику маршрутизации внутри него:

это ItemWriter, который будет заботиться о записи в разные места на основе вашего статуса с помощью классификатора.

    @Bean
    public ClassifierCompositeItemWriter<Item> classifierCompositeItemWriter(ItemWriter<Item> POSTGRESWriter, ItemWriter<Item> SQLWiter) {
        ClassifierCompositeItemWriter<Item> classifierCompositeItemWriter = new ClassifierCompositeItemWriter<>();
        classifierCompositeItemWriter.setClassifier((Classifier<Item, ItemWriter<? super Item>>) item-> {
            if (item.getStatus("Success")) {
                return POSTGRESWriter;
            } else {
                return SQLWiter;
            }
        });
        return classifierCompositeItemWriter;
    }

Вы можете настроить свой Шаг следующим образом:

    @Bean
    public Step process() {
        return stepBuilderFactory.get("dataExtraprocessctionStep")
                .<Item, Item>chunk(1)
                .reader(itemReader())
                .writer(classifierCompositeItemWriter(POSTGRESWriter(), SQLWriter()))
                .stream(POSTGRESWriter())
                .stream(SQLWriter())
                .build();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...