Spring Batch: Un lecteur de plusieurs processeurs et des écrivains
Dans Spring batch j'ai besoin de passer les articles lus par un ItemReader à deux processeurs différents et écrivain. Ce que je suis en train de réaliser, c'est que...
+---> ItemProcessor#1 ---> ItemWriter#1 | ItemReader ---> item ---+ | +---> ItemProcessor#2 ---> ItemWriter#2
Cela est nécessaire parce que les articles écrits par ItemWriter#1 devraient être traitées d'une manière complètement différente par rapport à celles écrites par ItemWriter#2.
En outre, ItemReader lit élément à partir d'une base de données et les requêtes qu'il exécute sont donc de calcul coûteux que l'exécution de la même requête à deux reprises doivent être jetés.
Tout soupçon sur la manière de réaliser un tel ensemble ? Ou, au moins, sont logiquement équivalentes ?
OriginalL'auteur danidemi | 2013-09-25
Vous devez vous connecter pour publier un commentaire.
Cette solution est valable si votre article devrait être traitée par le processeur #1 et le processeur #2
Vous devez créer un processeur #0 avec cette signature:
où
CompositeResultBean
est un bean défini commeDans votre Processeur #0 à seulement déléguer les tâches aux processeurs #1 et #2 et mettre le résultat dans
CompositeResultBean
Votre propre écrivain est un
CompositeItemWriter
que délégué à l'écrivainCompositeResultBean.result1
ouCompositeResultBean.result2
(regardez PropertyExtractingDelegatingItemwriter, peut-être peut aider)Ok, j'ai une solution pour ce problème. juste attendre pour le modifier
Je serais curieux de vous voir solution. Pourriez-vous avoir le temps de le mettre à jour ici?
Regarde ma vieille édition, devrait être la bonne solution...
OriginalL'auteur Luca Basso Ricci
J'ai suivi Luca la suggestion d'utiliser
PropertyExtractingDelegatingItemWriter
comme écrivain et j'ai été capable de travailler avec deux entités différentes en une seule étape.Tout d'abord ce que j'ai fait a été de définir un DTO qui stocke les deux entités/résultats du processeur
Puis j'ai passé cette DTO pour l'écrivain, un
PropertyExtractingDelegatingItemWriter
classe où j'définir deux méthodes personnalisées pour écrire les entités dans la base de données, voir mon écrivain code ci-dessous:Avec cette approche, vous pouvez obtenir le voulait le premier comportement à partir d'un seul lecteur pour le traitement de plusieurs entités et de les enregistrer en une seule étape.
OriginalL'auteur Juan Pablo G
Vous pouvez utiliser un
CompositeItemProcessor
etCompositeItemWriter
De ne pas ressembler exactement à votre schéma, il sera séquentielle, mais il va faire le travail.
Merci pour la mention de ces composants. Ils ont résolu mon problème
OriginalL'auteur Sebastien Lorber
Il existe une autre solution si vous avez une quantité raisonnable d'objets (comme des moins de 1 Go) : vous pouvez mettre en cache le résultat de vos sélectionner dans une collection enveloppé dans un Printemps bean.
Alors u peut juste lire la collecte deux fois, sans frais.
mmm non, les écrivains ne sont pas de transmettre les données les uns des autres, ils ont lu la même chose dans la mémoire de la collecte de l'intérieur d'un printemps singleton bean.
OriginalL'auteur Tristan
c'est la solution que j'ai trouvé.
Donc, l'idée est de coder une nouvelle de l'Écrivain qui "contient" les deux une ItemProcessor et un ItemWriter. Juste pour vous donner une idée, nous l'avons appelé PreprocessoWriter, et c'est le code de base.
Il y a beaucoup de choses laissées de côté. Gestion de ItemStream, par exemple. Mais dans notre scénario en particulier, c'était assez.
De sorte que vous pouvez combiner plusieurs PreprocessorWriter avec CompositeWriter.
Je suis d'accord avec vous sur le concept général. Cependant, comme vous l'avez sûrement lu dans la question d'origine, le problème était de lire des articles une fois, et de processus / écrire de deux manières complètement différentes. Donc, pouvez-vous s'il vous plaît partager la façon dont vous permettrait de résoudre le problème particulier de la question ?
Vérifier ma réponse pour que. Le traitement est réalisé à l'aide d'un composite de processeur en prenant un seul élément en entrée et une coutume de haricot (CompositeResultBean) en tenant le résultat de plusieurs traitement. Écrit par délégation: CompositeResultBean à l'entrée et appeler le bon délégué de l'écrivain pour CompositeResultBean.result1 et CompositeResultBean.result2. Lu une fois, le processus d'écriture/séparés ItemProcessor/ItemWriter à l'aide de la composition et de la délégation. Tout se fait sans problème concepts
OriginalL'auteur danidemi