Multi-itemwriters in Spring batch

j'écris actuellement un lot de printemps où je suis en train de lire un morceau de données, de les traiter et puis je souhaite transmettre ces données à 2 rédacteurs. Un rédacteur mettrait simplement à jour la base de données tandis que le second écrirait dans un fichier csv.

j'ai l'intention d'écrire mon propre écrivain et injecter les deux itemWriters dans le customItemWriter et d'appeler les méthodes d'écriture de l'article écrivains dans la méthode d'écriture de customItemWriter. Cette approche est-elle correcte? Il n'existe aucun Les implémentations ItemWriter disponibles qui répondent à mes exigences?

Merci d'avance

19
demandé sur Pratik Shelar 2013-09-20 15:30:09

5 réponses

Vous pouvez utiliser le Printemps CompositeItemWriter et délégué à les auteurs.

voici un exemple de configuration.

15
répondu Oussama Zoghlami 2013-09-20 12:26:21

Vous n'avez pas nécessairement besoin d'utiliser xml comme dans l'exemple. Si le reste de votre code utilise l'annotation, vous pouvez simplement faire ce qui suit.

public ItemWriter<T> writerOne(){
    ItemWriter<T> writer = new ItemWriter<T>();
    //your logic here
    return writer;
}

public ItemWriter<T> writerTwo(){
    ItemWriter<T> writer = new ItemWriter<T>();
    //your logic here
    return writer;
}

public CompositeItemWriter<T> compositeItemWriter(){
    CompositeItemWriter writer = new CompositeItemWriter();
    writer.setDelegates(Arrays.asList(writerOne(),writerTwo()));
    return writer;
}
7
répondu Yilei 2016-08-26 22:39:52

Vous avez eu raison. SB est fortement basé sur la délégation donc en utilisant un CompositeItemWriter est le bon choix pour vos besoins.

2
répondu Luca Basso Ricci 2013-09-20 12:24:29

selon vos besoins, une autre option est d'étendre la classe Writer et d'y ajouter des fonctionnalités. Par exemple, j'ai un projet où je vais étendre HibernateItemWriter et puis passer en écriture(liste des éléments). J'envoie ensuite les objets que j'écris avec mon répertoire sessionFactory à la méthode doWrite de L'écrivain: doWrite(sessionFactory, filteredRecords).

donc dans l'exemple ci-dessus, je pourrais écrire dans le fichier csv dans ma classe étendue et alors le HibernateItemWriter écrire dans la base de données. Ce n'est évidemment pas idéal pour cet exemple, mais pour certains scénarios, c'est une bonne option.

0
répondu MattC 2015-06-05 18:06:08

Java Config way SpringBatch4

@Bean
    public Step step1() {
            return this.stepBuilderFactory.get("step1")
                                    .<String, String>chunk(2)
                                    .reader(itemReader())
                                    .writer(compositeItemWriter())
                                    .stream(fileItemWriter1())
                                    .stream(fileItemWriter2())
                                    .build();
    }

    /**
     * In Spring Batch 4, the CompositeItemWriter implements ItemStream so this isn't
     * necessary, but used for an example.
     */
    @Bean
    public CompositeItemWriter compositeItemWriter() {
            List<ItemWriter> writers = new ArrayList<>(2);
            writers.add(fileItemWriter1());
            writers.add(fileItemWriter2());

            CompositeItemWriter itemWriter = new CompositeItemWriter();

            itemWriter.setDelegates(writers);

            return itemWriter;
    }
0
répondu Niraj Sonawane 2018-09-03 07:15:32