Comment pouvons-nous partager les données entre les différentes étapes d'un Travail de Spring Batch?
De creuser dans Spring Batch, je voudrais savoir Comment peut-on partager des données entre les différentes étapes d'un Travail?
Peut-on utiliser JobRepository pour cela? Si oui, comment pouvons-nous faire?
Est-il un autre moyen de faire/réaliser la même chose?
Vous devez vous connecter pour publier un commentaire.
l'emploi référentiel est utilisé indirectement pour le passage des données entre les étapes (Jean-Philippe est juste que la meilleure façon de le faire est de mettre les données dans le
StepExecutionContext
puis utilisez le avec beaucoup de détails nomméExecutionContextPromotionListener
pour promouvoir l'exécution de l'étape contexte clés de laJobExecutionContext
.Il est utile de noter qu'il existe un écouteur pour la promotion de
JobParameter
clés d'unStepExecutionContext
ainsi (encore plus avec beaucoup de détails nomméJobParameterExecutionContextCopyListener
); vous trouverez ces beaucoup si des étapes de travail ne sont pas complètement indépendants l'un de l'autre.Sinon, vous êtes de gauche le passage des données entre les étapes à l'aide encore plus à des systèmes élaborés, comme des files d'attente JMS, ou (à dieu ne plaise) codée en dur emplacements des fichiers.
Quant à la taille des données qui est transmis dans le contexte, je dirais aussi que vous garder les petits (mais je n'ai pas tout les détails sur le
D'une étape, vous pouvez mettre les données dans le
StepExecutionContext
.Puis, avec un écouteur, vous pouvez promouvoir des données à partir de
StepExecutionContext
àJobExecutionContext
.Ce
JobExecutionContext
est disponible dans toutes les étapes suivantes.Attention : les données doivent être court.
Ces contextes sont enregistrés dans le
JobRepository
par la sérialisation et la longueur est limitée (2500 caractères si je me souviens bien).Donc ces contextes sont bonnes pour partager des chaînes ou des valeurs simples, mais pas pour le partage de collections ou d'énormes quantités de données.
Partage d'énormes quantités de données n'est pas la philosophie de Spring Batch.
Spring Batch est un ensemble d'actions distinctes, pas un énorme Business unité de traitement.
Je dirais que vous avez 3 options:
StepContext
et de le promouvoir àJobContext
et vous y avez accès à partir de chaque étape, vous devez comme indiqué obéir à la limite de la taille@JobScope
de haricots et ajouter des données à cet haricot,@Autowire
elle en cas de besoin et de l'utiliser (inconvénient est que c'est en mémoire de la structure et si échec du travail de perte de données, mlgh causer des problèmes avec la possibilité de redémarrage)ids
dansJobContext
et l'accès en cas de besoin et supprimer cette table temporaire lorsque le travail se termine avec succès.Vous pouvez utiliser un Bean Java Objet
De cette façon, vous pouvez stocker une grande collection de données si vous le souhaitez
Voici ce que j'ai fait pour enregistrer un objet qui est accessible à travers les étapes.
Vous pouvez stocker des données dans l'objet simple. Comme:
Juste ajouter des données à l'objet de l'écrivain ou de toute autre méthode et de l'obtenir dans n'importe quel stade de la prochaine étape
Utiliser `ExecutionContextPromotionListener .
Maintenant, vous devez ajouter promotionListener à votre travail
Maintenant, dans step2 récupérer vos données à partir d'emploi ExecutionContext
Si vous travaillez avec tasklets, puis utilisez suivantes pour obtenir ou mettre ExecutionContext
M'a donné une tâche à invoquer le lot de travail, un par un.Chaque tâche dépend d'un autre. Premier résultat de travail doit exécuter la conséquence de l'emploi du programme.
J'étais à la recherche de savoir comment transférer les données après l'exécution de la tâche. J'ai trouvé que ce ExecutionContextPromotionListener est très pratique.
1) j'ai ajouté un bean pour "ExecutionContextPromotionListener" comme ci-dessous
2) Puis j'ai attaché l'un de l'auditeur à mon Étapes
3) j'ai ajouté stepExecution comme une référence dans mon Écrivain étape de la mise en œuvre et peuplé de la Beforestep
4) à la fin de mon écrivain étape, j'ai remplie les valeurs de la stepexecution comme les touches comme ci-dessous
5) Après l'exécution de la tâche, j'ai récupéré les valeurs de la
lExecution.getExecutionContext()
et peuplée que la réponse à un travail.6) de l'objet de réponse, je vais obtenir les valeurs et remplir les valeurs requises dans le reste de l'emploi.
Le code ci-dessus est pour la promotion de la données de la procédure pour ExecutionContext à l'aide de ExecutionContextPromotionListener.
On peut le faire dans l'une quelconque des étapes.
Que Nenad Bozic a dit dans sa 3ème option, l'utilisation de tables temporaires pour partager les données entre les étapes, à l'aide de contexte à part le fait aussi la même chose, il écrit au tableau et les charges de retour dans la prochaine étape, mais si vous ecrire dans des tables temporaires, vous pouvez nettoyer à la fin de l'emploi.
Un autre très simplement approche, laissant ici pour référence future:
getExecutionContext
est ici:Le mettre dans une super classe, dans une interface comme un
default
méthode, ou tout simplement de coller dans votreTasklet
s.