IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Spring-batch : chunck et multi-threading


Sujet :

Spring Java

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Août 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 51
    Points : 46
    Points
    46
    Par défaut Spring-batch : chunck et multi-threading
    bonjour,

    j'utilise spring-batch pour traiter de gros fichiers xml.

    Pour cela je traite les fichiers par lots (chunck) et j'utilise le multi-threading (TaskExecutor).

    Mon reader est StaxEventItemReader. Mais ce dernier n'est pas safe-thread et j'ai des erreurs du type :

    org.springframework.batch.item.NonTransientResourceException: Error while reading from event reader
    AVERTISSEMENT: ItemStream was opened in a different thread. Restart data could be compromised.

    Comment puis-je faire du multi-threading en utilisant StaxEventItemReader ?

    merci pour vos reponses

  2. #2
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    Bonjour,
    Le multi-threading n'est utile que si les différents threads peuvent faire plusieurs choses en même temps. Dans le cas de figure d'une lecture sur fichier, pour lequel la ressource est unique, la parallélisation ne va pas accélérer la lecture. Ma remarque n'indique pas que votre batch ne gagnera pas en performance, car le processor et le writer pourraient bénéficier de cette parallélisation. Par contre, il ne devrait pas gagner en performance si c'est la lecture qui représente la plus grande partie du temps de traitement.

    Ceci dit, j'imagine (sans l'avoir testé faute d'un cas concret posant problème) qu'il est possible de tenter de faire un Reader qui soit thread-safe sur une idée de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class SyncStaxEventItemReader<T> extends StaxEventItemReader<T> {
        @Override
        protected synchronized T doRead() throws Exception {
            return super.doRead();
        }
     
        @Override
        protected synchronized void doOpen() {
            try {
                super.doOpen();
            } catch (Exception e) {
                // ignore the error
            }
        }
    }
    D'autres méthodes doivent probablement être synchronisées si d'autres erreurs surviennent.
    Ce code n'est pas très élégant, mais la resource du StaxEventItemReader étant privée (et aucun getter ne permettant d'y accéder), il n'est pas possible (hors réflexivité) d'utiliser un code moins moche comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        @Override
        protected synchronized void doOpen() {
            if(!this.resource.isOpen()){
                super.doOpen();
            }
        }
    Il faut de plus être conscient que multi-threader la lecture exclut la possibilité d'utiliser les mécanismes de restart du batch (ou du moins Spring déconseille fortement d'utiliser les deux). Si il est acceptable de ne pas pouvoir reprendre le traitement au point où il en était, le code proposé ci-dessus (moyennant des tests et du debug), devrait peut être pouvoir vous aider.

    En espérant avoir proposé une piste de réflexion (à défaut d'une solution parfaite).

    Patrick
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

Discussions similaires

  1. Batch Java pour une mailBox en multi threading
    Par younesms dans le forum Général Java
    Réponses: 2
    Dernier message: 07/03/2013, 13h47
  2. [Batch] Spring batch ou thread démon ?
    Par eric95 dans le forum Spring
    Réponses: 0
    Dernier message: 07/07/2010, 18h02
  3. [Framework] [Core] les singleton Spring sont-ils multi thread ?
    Par mrjeronimo dans le forum Spring
    Réponses: 8
    Dernier message: 24/06/2008, 12h28
  4. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  5. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo