Spring Batch Multi Threading - Comment faire de chaque thread de lecture des enregistrements uniques?
Cette question a été posée de nombreuses fois dans de nombreux forums. Mais je ne vois pas une réponse qui me convient. Je suis en train de mettre en œuvre Multi-thread Étape dans mon spring batch de mise en œuvre.
- Avoir une table intermédiaire avec 100k enregistrements
- Voulez traiter 10 threads de l'intervalle de validation 300 par thread afin de 3000 enregistrements à tout moment.
- J'ai défini un exécuteur de tâches et l'a renvoyé l'intérieur de l'étape, je voulais multi thread
- Mon idée est que d'abord je voudrais obtenir la taille du pool de threads (10) et la mise à jour de la thread_id colonne avec un velue(peut être de 1 à 10) à chacune des 100 enregistrements. Dans ce cas de 10 threads et 100 dossiers de 10k dossiers sera attribué un id - je suis en train de mettre en œuvre un stagingsteplistener pour ce faire.
- a écrit un lecteur pour cette mise en scène de la table. exécuteur de tâches permettra de créer 10 lecteurs et chaque lecteur doit lire de 300 différents dossiers et les processus eux - Maintenant, comment puis-je passer une commune id
entre l'étape de l'auditeur et du lecteur, de sorte que chaque thread aura
son propre ensemble de dossiers à traiter.
Comme de maintenant, je n'ai qu'une JVM. Donc, je suis à la pensée de le faire en Multi Threaded étape elle-même plutôt que de penser partition.
S'il vous plaît aider......
J'ai évoqué pro spring batch livre et a créé une mise en scène de l'étape auditeur qui est l'acceptation d'un id d'exécution de la tâche de configuration xml à l'aide de paramètres de travail comme ci-dessous
<beans:bean id="stagingStepListener"
class="com.apress.springbatch.statement.listener.StagingStepListener" scope="step">
<beans:property name="dataSource" ref="dataSource"/>
<beans:property name="tableName" value="transaction"/>
<beans:property name="whereClause"
value="where jobId is null and processed is null"/>
<beans:property name="jobId" value="#{jobParameters[run.id]}"/>
</beans:bean>
Ce que je ne la trouvez pas? D'où est ce "exécuter.id" en venant de. Je ne vois pas que, dans n'importe quel endroit dans le livre. J'ai copié la même mise en œuvre dans mon spring batch et quand je le lance je vois exception en disant que s'exécuter.l'id n'est pas identifiable. Merci de m'aider à propos de comment faire cela?
OriginalL'auteur Shiva | 2012-01-31
Vous devez vous connecter pour publier un commentaire.
JobParameters
C'est juste un paramètre qui vous passer à jobParameters. Habituellement, un autre
run.id
(un nom conventionnel) pour chaque instance est utilisé parce que le cadre a aucun moyen de savoir quels changements à la JobParameters d'en faire le "prochain" instance de travail.Vous pouvez passer cette "exécuter.id" à la jobParameters:
prendre un coup d'oeil à la
JobParametersIncrementer
's la documentation pour plus de détails.Ne pas
C'est assez dangereux, car de nombreux participants dans l'Étape (par exemple, des lecteurs et des auteurs) sont dynamiques, et si l'état n'est pas séparé par fil, puis ces composants ne sont pas utilisables dans un environnement multi-thread Étape. En particulier, la plupart des hors-la-plateau des lecteurs et des écrivains de Spring Batch ne sont pas conçus pour le multi-thread utilisation.
Partitionnement
Je vous recommande d'utiliser Partitionnement. Il est beaucoup plus simple qu'il n'y paraît, et vous pouvez toujours utiliser plusieurs threads pour elle. Jetez un oeil à l'exemple de lot de travaux qui utilisent partitionnement, qui vient de "Spring Batch échantillons" est là pour:
spectacle multi-thread exécution étape par étape à l'aide de la PartitionHandler SPI. L'exemple utilise un TaskExecutorPartitionHandler diffuser le travail de lecture de certains fichiers de soccer de plusieurs threads, avec une Étape d'exécution par thread. Les principaux composants sont le PartitionStep et la MultiResourcePartitioner qui est responsable de la division du travail. Notez que les lecteurs et les écrivains dans l'Étape de partitionnement sont l'étape d'étendue, de sorte que leur état n'obtient pas partagées entre les threads d'exécution.
Aucun des liens dans cette réponse sont trouvés, 404.Je sais que je suis un vieux de réponse, mais juste de pointer du doigt.
Les échantillons ont été déplacés vers GitHub: échantillons
les liens sont mis à jour. merci de nous signaler le problème
OriginalL'auteur tolitius