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

Java EE Discussion :

Attendre la fin du process d'un MDB [EJB MDB]


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut Attendre la fin du process d'un MDB
    Bonjour,

    je coince sur un petit problème pour un unit test. J'ai un paquet de MDB qui s'inscrivent sur une topic, un truc dans ce genre là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/someTopic"),
        @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1"),
        @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),
        @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "XYZHandlerEJB3"),
        @ActivationConfigProperty(propertyName = "clientId", propertyValue = "XYZHandlerEJB3") })
    public class XYZHandler implements MessageListener {
     
      @Override
      public void onMessage(Message message) {
    J'ai de l'autre coté des unit test qui font actuellement ceci:

    • poster un message sur la queue
    • attendre 1 secondes
    • s'assurer que l'état de la DB correspond à ce qui est attendu après traitement


    multiplié par le nombre de tests, on est de l'ordre de 30 minutes pour lancer les tests sur les MDB. Sachant qu'on attends 1s quelque chose qui s'exécute typiquement en 20/30ms, y a de la perte de temps. J'avais pensé créer un MDB de test qui, lorsqu'il reçoit le message, abaisse un flag pour dire au unit test "message reçu". Mais non, les MDB s'exécutant en parallèle, mon MDB ne bloque pas l'exécution des autres, et les autres ne bloquent pas le mien. Du coup ce n'est pas parce que j'ai reçu le message que c'est traité...

    Je voudrais savoir quelles seraient les alternatives. Est-il possible d'empêcher le parallélisme entre les MDB? De garantir un ordre d'execution des MDB (genre le MDB test uniquement quand les autres ont fini)? De savoir quand un message a été entièrement traité? Enrober mes MDB avec des post message hooks durant le test (et comment)?

    Je précise que je peux rajouter des MDB supplémentaire, je peux jouer sur la config de la queue (c'est du Hornet MQ), jouer sur la config ejb3 utilisée par le unit test. Par contre l'option d'aller rajouter du code dans les MDB buisness n'est pas acceptable, ils doivent être performant et, par exemple, rajouter une queue de ack les rendrait trop lents. Ensuite, d'une manière général, je ne veux pas de code ne servant qu'aux tests dans la partie buisness.

  2. #2
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Bon bon bon, il y a du nouveau.

    J'arrive à catcher la fin des MDB en utilisant des EJB3 interceptor. Soucis restant: quand mon interceptor reprend la main après le onMessage, on est toujours dans la transaction. Mon interceptor envoie ensuite un message sur un autre queue, qui est réceptionné et traité... avant que l'EntityManager du premier bean n'ai fait son commit. Un poil de milliesoncdes trop tôt donc. J'avais pensé qu'en repassant par une queue j'ai pas ce problème, mais si. Il semble que le deuxième MDB qui écoute les messages lancé par l'interceptor, reçoive le message alors même que la transaction de l'interceptor n'est pas cloturée. Comment est-ce possible? Je pensais qu'en CMP, le message ne pouvait pas partir avant le commit?

    pour schématiser, j'ai ceci:
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unit test => message Topic1 => wait sur semaphore                                                                                                    //=> Reprise => Données pas présentes dans DB
                 ||                                                                                                   //=> MDB2.onMessage() => libérer le sémaphore 
                 \\=> Interceptor MDB1 => MDB1.onMessage() (avec de l'entitymanager et tout) => Interceptor MDB1 => message vers Topic 2 ===========================================================> update DB par entitymanager

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Par défaut
    Salut Tchize_,

    Si j'ai bien compris, tu veux pouvoir détecter la fin de processing asynchrone pour en vérifier le résultat en DB.
    Le truc qui me vient naïvement, c'est:
    • top dans une table technique lié au protocole de test en fin de traitement MDB ( via interceptor pour ne pas toucher ton business code ).
    • le bloc de test fait un "polling" de la table de test pour pouvoir lancer la vérification ( post -> poll -> verify ).

    Avec un identifiant en JMSProperty qui pourrait être une "clef de corrélation" entre ton traitement et ton test, par exemple.

    Cordialement,
    Sébastien

  4. #4
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    J'ai trouvé et oublié de poster finalement.


    Alors d'abord, si on avait le deuxième message avant le commit, il semblerait que ce soit du à une particularité de jboss embedded qu'on utilise pour les tests: JMS n'y est pas transactionnel pour l'envoi de nouveaux messages

    Ensuite, j'ai résolu le problème du "c'est bon, fini tu peux reprendre la main" en injectant dans l'interceptor le TransactionManager via un @Resource et en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    transactionManager.getTransaction().registerSynchronization(new Synchronization(){
    //... et on fait le job dans le afterCompletion() ;)
    });
    J'avais pensé aussi la à DB, mais du coup on ne reçois pas le TOP de fin si la transaction est annulée. Hors on pourrait vouloir s'assurer que l'action JMS a été refusée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Linux] attendre la fin d'execution d'un process en C
    Par yan dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 28/08/2014, 10h21
  2. [Débutant] Comment attendre la fin d'un process lancé par ShellExecute ou ShellExecuteEx
    Par Godzestla dans le forum C++Builder
    Réponses: 3
    Dernier message: 19/05/2011, 12h34
  3. [PowerShell] Attendre la fin d'un process avant de continuer une boucle
    Par suchiwa dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 16/02/2011, 10h26
  4. Execution process sans attendre la fin
    Par zz2f3 dans le forum Langage
    Réponses: 3
    Dernier message: 16/06/2008, 17h43
  5. [Process] comment attendre la fin du chargement?
    Par elflamby dans le forum VB.NET
    Réponses: 1
    Dernier message: 03/04/2007, 15h04

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