Spring Batch : Tasklet avec multi threaded exécuteur testamentaire est très mauvaises performances liées à la Limitation de l'algorithme de

À l'aide de Spring batch 2.2.1, j'ai configuré un Spring Batch Job, j'ai utilisé cette approche:

Configuration est la suivante:

  • Tasklet utilise ThreadPoolTaskExecutor limité à 15 threads
  • gaz-limite est égal au nombre de threads
  • Bloc est utilisé avec:
    • 1 synchronisé adaptateur de JdbcCursorItemReader pour permettre son utilisation par de nombreux threads comme par Spring Batch documentation recommandation

      Vous pouvez synchroniser l'appel à read() et aussi longtemps que le traitement et l'écriture est la partie la plus coûteuse de la partie de votre étape peut encore terminer beaucoup plus rapidement que dans un seul thread de configuration.

    • saveState est fausse JdbcCursorItemReader
    • Personnalisé ItemWriter basée sur la JPA. Noter que le traitement d'un élément peut varier en termes de temps de traitement, il peut prendre quelques millis à quelques secondes ( > 60).
    • commettre l'intervalle de mise à 1 (je sais que ça pourrait être mieux, mais c'est pas la question)
  • Tous jdbc piscines sont très bien, à propos de Spring Batch doc recommandation

L'exécution du lot mène à la très étrange et de mauvais résultats pour les raisons suivantes:

  • à une certaine étape, si les éléments à prendre du temps pour traiter par un écrivain, presque tous les threads du pool de threads finissent par ne rien faire au lieu de traitement, seulement la lenteur de l'écrivain est de travail.

Regarder Spring Batch de code, la cause semble être dans ce package:

  • org/springframework/lot/répétition/support/

Est cette façon de travailler d'une fonction ou est-ce une limitation/bug ?

Si c'est une fonction, ce qui est la façon par la configuration de tous les threads sans être affamés par le long travail de traitement sans avoir à réécrire tout ?

Noter que si tous les éléments prennent le même temps, tout fonctionne bien et le multi-threading est OK, mais si une de l'élément le traitement prend beaucoup plus de temps, puis multi-threading est à peu près inutile pour le moment, le lent processus fonctionne.

Remarque, j'ai ouvert ce problème:

OriginalL'auteur pmpm | 2013-08-15