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 :

Ecrire dans un reader


Sujet :

Spring Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 41
    Points : 39
    Points
    39
    Par défaut Ecrire dans un reader
    Bonjour,

    Comment écrire en base au moment du Read ?

    Contexte :
    J'ai un projet en base de données qui peut être sous différents états :
    - A_FAIRE
    - EN_COURS
    - EN_ERREUR
    - TERMINER

    Un batch est chargé de récupérer les projets A_FAIRE et d'exécuter différents traitements.

    Objectif :
    L'objectif est de faire passer chaque projet en cours de traitement par le batch à EN_COURS dès que le projet est pris en charge par le batch.

    Problème :
    Spring batch effectue le commit uniquement après le write.
    Le projet passe donc fonctionnelement de A_FAIRE, En_COURS, TERMINER correctement mais côté base de donné, le projet passe de A_FAIRE à TERMINER directement car la phase EN_COURS n'est pas commitée.

    J'aurai souhaiter pouvoir dès le Read faire passer mon projet à EN_COURS en base de données.

    avez vous une idée ?

    cordialement

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Tu dois faire un commit pour que les données soient visible. Donc tu dois travailler, suivant ta logique, en plusieurs transaction
    1) récupération d'un project et passage à en cours : commit
    2) opérations sur le projet et passage à terminé: commit
    3) passer au projet suivant.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Merci pour votre réponse,

    Cependant, le problème est qu'il peut potentiellement y avoir plusieurs batchs de lancés à intervalles réguliers. Les changements d'états du projet doivent donc se réaliser dans le step courant. 1 step, 3 états.
    Si je suis votre raisonnement, des processus pourraient se chevaucher.

    - Batch1 :
    - Step 1
    - Read : récupère le projet A_FAIRE
    - Process : passage à EN_COURS
    - Write : commit

    - Batch1
    - Step 2
    - Read : récupère projet en cours
    - Process : traitement
    - Write : passage projet TERMINER

    - Batch2
    - Step2
    - Read : récupère projet en cours
    - Process : traitement
    - Write : passage projet TERMINER

    Comment le Batch2 pourrait il savoir que le projet récupéré n'est pas déjà en traitement par le batch1 ?

    c'est pourquoi la gestion de l'état du projet doit être géré durant le Step.

    Solution utilisée:
    J'ai trouvé une solution paliative. Je ne sais pas si cela respecte la logique Spring batch.
    J'ai instancé deux connexions. 1 pour le traitement du batch, et 1 pour la gestion de l'état du projet.

    Ainsi lors du READ j'ai implémenté la méthode afterRead qui se charge de passer le projet récupéré à EN_COURS en utilisant une transaction différente de celle utilisée par le batch. Puis lors du WRITE j'ai implémenté la méthode afterWrite qui se charge de passer le projet à l'état TERMINER.

    Ceci permet à deux batchs d'être exécutés à intervalles différents, et ceci sans le risque que deux batchs traitent le même projet.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Citation Envoyé par mickael.camelot Voir le message

    Comment le Batch2 pourrait il savoir que le projet récupéré n'est pas déjà en traitement par le batch1 ?
    Parce que ce n'est pas lui qui l'a passé de A faire à en cours. C'est l'idée, celui qui fait passer à en cours endosse la responsabilité de le traiter dans la transaction suivante. C'est à peu près ce que tu met dans ta solution paliative qui a quand même quelques soucis.
    Tes deux transactions de batch 1 manipulent le projet en // (begin begin commit commit) et non pas l'une à la suite de l'autre (begin commit, begin commit) => elles risquent de se marcher sur les pieds et déclencher une erreur dans le SGDB si elles tentent de manipuler les même row.

    Pour que les autres process / autres batch voient les changements dans A faire -> En cours alors que tu n'a pas commit la transaction, tu a du diminuer le niveau d'isolation de tes transaction avec tous les problèmes qui vont avec (dirty read, phantom read, ...) ce qui n'est pas recommandé. Il est de loin préférable d'avoir autant que possible des transaction isolées en SERIALIZABLE.

Discussions similaires

  1. Ecrire dans un DIV.
    Par cocula dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/02/2005, 15h01
  2. Ecrire dans un fichier grace à un trigger ?
    Par zigoo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/10/2004, 20h03
  3. [VBS] Ecrire dans les Eventlog avec VBS
    Par Hakkou dans le forum VBScript
    Réponses: 1
    Dernier message: 04/10/2004, 14h50
  4. Réponses: 2
    Dernier message: 08/04/2004, 11h11
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44

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