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

Glassfish et Payara Java Discussion :

MDB local vers MDB distant


Sujet :

Glassfish et Payara Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 25
    Points
    25
    Par défaut MDB local vers MDB distant
    Bonjour tout le monde
    je viens désespérément après une semaine de galère: je veux faire communiquer deux serveurs glassfish par messages JMS. voilà le scénario:
    - sur mon serveur local j'ai un message driven bean MDB1 qui consomme un message m d'un client sur la même JVM

    - je voudrais que MDB1 renvoi après consommation le message m à un serveur distant sur lequel se trouve un autre message driven bean MDB2 qui doit consommer ce message.

    voilà ce sur quoi je galère, j'ai codé déjà les deux mdb qui de façon locale fonctionnent maintenant comment les faire communiquer ...
    Quelques indices m'aideront ... Merci d'avance

    Indications: je code sous netbeans; serveur d'application: glassfish v3
    -----------

  2. #2
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    j'ai lu les liens mais mon problème c'est de rendre un mdb consommateur à la fois aussi producteur d'un message vers un autre mdb sur autre pc...

    je ne sais pas si je me fais comprendre ....
    merci

  4. #4
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    si si, regarde le dernier lien, c'est le cas.
    Ca te montre comment te connecter à distance à une queue JMS pour le MDB
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  5. #5
    Membre du Club
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 36
    Points : 59
    Points
    59
    Par défaut
    Je pense que ce que demande frejus, c'est comment envoyer un message à destination de l'autre MDB.

    Il n'y a rien de particulier à être dans un MDB pour envoyer un message. Tu dois faire comme si tu envoyais un message JMS depuis n'importe quelle classe Java. Regarde ça pour la partie envoi du message JMS : http://developers.sun.com/appserver/...june_2003.html

    Pour le fait qu'il soit sur un autre PC : c'est là que le lien de fxrobin peut t'aider, la création de l'InitialContext que tu utilises doit se faire avec des propriétés contenant l'URL cible. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Properties prop = new Properties();
    prop.put(Context.PROVIDER_URL, "iiop://monserveur:8080");
    //autres propriétés
    Context jndiContext = new InitialContext(prop);
    Autre solution : tu postes sur une queue ou un topic JMS local, que tu relies à la queue ou au topic distant. Là, c'est purement de la configuration de serveur d'application, et je ne connais pas assez bien Glassfish pour te répondre.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    je suis d'accord mais dans ce cas je voudrais faire de l'asynchrone c'est-à-dire même si le client récepteur vient se connecter après qu'il recoive les messages envoyés à son absence ... et là je me demande si en reliant juste deux topics cela marcherait .......

  7. #7
    Membre du Club
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 36
    Points : 59
    Points
    59
    Par défaut
    Ca n'a pas de rapport avec le fait que ce soit distant ou local. Un MDB peut se brancher à une Queue (file d'attente) ou un Topic.

    Dans le premier cas, les messages sont persistés jusqu'à ce que quelqu'un les lise, mais ils seront lus par un seul composant (ie, si plusieurs MDB sont branchés sur la même Queue, seul le premier arrivé aura le message). Ca m'a l'air d'être ce que tu veux.

    Dans le second, ils sont transmis à tous les MDB inscrits sur le Topic (donc démarrés) au moment où le message arrive. Du coup, si ton MDB est arrêté à ce moment, il ne recevra pas le message.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Ok pour etre plus pratique...
    Sur mon serveur local j'ai :
    Topicconnectionfactory: topicfactory
    Topic: topic

    Sur le serveur distant j'ai :
    Topicconnectionfactory: topicfact
    Topic: Mtopic

    Alors Sur le serveur local j'ai un client qui envoie un message au MDB connecté au Topic topic
    Voici le client :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package client;
     
    import java.awt.SystemColor;
    import javax.jms.*;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
     
    /**
     *
     * @author laleye
     */
    public class client2 {
     
        public static void main(String[] args) throws NamingException, JMSException{
                Context ctx = new InitialContext();
        // 1: recherche d'une fabrique de connection via  JNDI
       TopicConnectionFactory factory=(TopicConnectionFactory) ctx.lookup("topicfact");
                // QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("topicfact");
     
        // 2: Utilisation de la fabrique de connexions pour créer une connexion JMS
     TopicConnection connection=factory.createTopicConnection();
       //  QueueConnection connection = factory.createQueueConnection();
     
        // 3: Utilisation de la connection pour créer une session
     TopicSession session = connection.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE);
        // QueueSession session = connection.createQueueSession(false,  QueueSession.AUTO_ACKNOWLEDGE);
     
        // 4: Recherche du sujet (topic) via JNDI
      Topic topic=(javax.jms.Topic) ctx.lookup("jms/Mtopic");
      //  javax.jms.Queue queue = (javax.jms.Queue) ctx.lookup("jms/Mtopic");
     
        // 5: Création d'un producteur de message
      MessageProducer sender=session.createPublisher(topic);
     //TopicSubscriber topicSubscriber = session.createSubscriber(topic);
      //MessageConsumer cons=session.createConsumer(topic);
      connection.start();
     
     
       //  6: Creation d'un  message texte et publication
        TextMessage msg = session.createTextMessage();
         msg.setText("12,papa,vivi,oueme,porto,tokpota,6789.0");
          sender.send(msg);
     
     
        connection.close();
       sender.close();
        session.close();
    connection.close();
    System.exit(0);
    }
        }
    Voici le code du MDB local qui reçoit le message :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package mdb;
     
    import entite.Facture;
    import javax.annotation.Resource;
    import javax.ejb.ActivationConfigProperty;
    import javax.ejb.MessageDriven;
    import javax.ejb.MessageDrivenContext;
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageListener;
    import javax.jms.TextMessage;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    import msgbean.*;
     
    /**
     *
     * @author laleye
     */
    @MessageDriven(mappedName = "jms/Mtopic", activationConfig = {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
        @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),
        @ActivationConfigProperty(propertyName = "clientId", propertyValue = "NewMessageBean"),
        @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "NewMessageBean")
      //  @ActivationConfigProperty(propertyName = "addresslist", propertyValue = "192.168.1.185:21998")    
    })
    public class NewMessageBean implements MessageListener {
        @Resource MessageDrivenContext mdc;
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("MessageBean_EssaiPU");
     // récupérer un EntityManagerFactory à partir de l'unité de persistance
        EntityManager em =emf.createEntityManager();
        public NewMessageBean() {
        }
     
        @Override
        public void onMessage(Message msg) {
            TextMessage tm;
        try {
          if (msg instanceof TextMessage){
            tm = (TextMessage) msg;
            int val=msg.getJMSPriority();
            String text = tm.getText();
            System.out.println(text);
     //  problème 
     
          }
          else {
            System.out.println ("Message de mauvais type : "+msg.getClass().getName());
          }
        }catch(JMSException e) {
          e.printStackTrace();
          mdc.setRollbackOnly ();
        }catch(Throwable te) {
          te.printStackTrace();
        }
      }
     
    }
    Dans le code la partie où j'ai indiqué problème, c'est donc à cette partie que je veux le mettre le code qui doit rediriger le message reçu vers un le topic distant se trouvant sur le serveur distant.

    Voilà donc mon inquiétude de façon pratique ... vu l'urgence je vous remercie pour l'aide

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Escusez j'ai inversé les différents topics par rapport au serveur local et distant

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Voilà le code complet du mdb local qui doit envoyer le message reçu sur le topic distant ...
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
      /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package mdb;
     
    import java.util.Properties;
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.annotation.Resource;
    import javax.ejb.ActivationConfigProperty;
    import javax.ejb.MessageDriven;
    import javax.jms.*;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import persistence.Facture;
    import teset.*;
     
    /**
     *
     * @author laleye
     */
    @MessageDriven(mappedName = "jms/topic", activationConfig = {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
        @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),
        @ActivationConfigProperty(propertyName = "clientId", propertyValue = "NewMessageBean"),
        @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "NewMessageBean")
    })
    public class NewMessageBean implements MessageListener {
     
     
        public NewMessageBean() {
        }
     
        @Override
        public void onMessage(Message msg) {
           TextMessage tm;
        try {
          if (msg instanceof TextMessage){
            tm = (TextMessage) msg;
            int val=msg.getJMSPriority();
            String text = tm.getText();
            System.out.println(text);
          String[] msgextract=text.split(",");
        //    NewSessionBean md=new NewSessionBean();
         //    md.CreerFacture(Integer.parseInt(msgextract[0]), msgextract[1], msgextract[2], msgextract[3], msgextract[4], msgextract[5], Double.parseDouble(msgextract[6]));
        //    sendPrintingMessage(tm) ;
          envoi(tm);
     
          }
          else {
              System.out.println("mauvais format");}
     
          }catch(Exception e){e.printStackTrace();}
     
        }
        public void envoi(Message m) throws NamingException, JMSException{
     
            Properties props = new Properties();
     
      props.setProperty("java.naming.factory.initial", 
                        "com.sun.enterprise.naming.SerialInitContextFactory");
     
      props.setProperty("java.naming.factory.url.pkgs", 
                        "com.sun.enterprise.naming");
     
      props.setProperty("java.naming.factory.state",
                        "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
     
     
      // optional.  Defaults to localhost.  Only needed if web server is running 
      // on a different host than the appserver    
      props.setProperty("org.omg.CORBA.ORBInitialHost", "hote");
     
      // optional.  Defaults to 3700.  Only needed if target orb port is not 3700.
      props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
     
      InitialContext ctx = new InitialContext(props);
     
                //  Context ctx = new InitialContext();
        // 1: recherche d'une fabrique de connection via  JNDI
       TopicConnectionFactory factory=(TopicConnectionFactory) ctx.lookup("topicfact");
                // QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("topicfact");
     
        // 2: Utilisation de la fabrique de connexions pour créer une connexion JMS
     TopicConnection connection=factory.createTopicConnection();
       //  QueueConnection connection = factory.createQueueConnection();
     
        // 3: Utilisation de la connection pour créer une session
     TopicSession session = connection.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE);
        // QueueSession session = connection.createQueueSession(false,  QueueSession.AUTO_ACKNOWLEDGE);
     
        // 4: Recherche du sujet (topic) via JNDI
      Topic topic=(javax.jms.Topic) ctx.lookup("jms/Mtopic");
      //  javax.jms.Queue queue = (javax.jms.Queue) ctx.lookup("jms/Mtopic");
     
        // 5: Création d'un producteur de message
      MessageProducer sender=session.createPublisher(topic);
     //TopicSubscriber topicSubscriber = session.createSubscriber(topic);
      //MessageConsumer cons=session.createConsumer(topic);
      connection.start();
    //
    //
    //   //  6: Creation d'un  message texte et publication
    //    TextMessage msg = session.createTextMessage();
    //  //  for (int i=0;i<2;i++){
    //      msg.setText("2,SAIZONOU,Romaine,OUEME,Porto-novo,tokkpota,56789.0");
          sender.send(m);
        //  sender.send(msg);
    //sender.send(session.createMessage());
     //   }
    //session.close();
    //connection.close();
    //    
    // // topicSubscriber.close();
       sender.close();
    //  //  connection.stop();
        session.close();
    connection.close();
    System.exit(0);
     
        }
     
    }
    En exécutant, il reçoit bien le message du client local mais pour le renvoi vers le topic distant voici donc l'erreur générée ...
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
        INFO: 20,toto,Romaine,vouvou,Porto-novo,tokkpota,589.0
    GRAVE: com.sun.messaging.jms.JMSException: MQRA:DCF:allocation failure:createConnection:No such resource : topicfact
    	at com.sun.messaging.jms.ra.DirectConnectionFactory._allocateConnection(DirectConnectionFactory.java:548)
    	at com.sun.messaging.jms.ra.DirectConnectionFactory.createTopicConnection(DirectConnectionFactory.java:378)
    	at com.sun.messaging.jms.ra.DirectConnectionFactory.createTopicConnection(DirectConnectionFactory.java:356)
    	at mdb.NewMessageBean.envoi(NewMessageBean.java:112)
    	at mdb.NewMessageBean.onMessage(NewMessageBean.java:74)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:616)
    	at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
    	at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
    	at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:4154)
    	at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5346)
    	at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5326)
    	at com.sun.ejb.containers.MessageBeanContainer.deliverMessage(MessageBeanContainer.java:1093)
    	at com.sun.ejb.containers.MessageBeanListenerImpl.deliverMessage(MessageBeanListenerImpl.java:81)
    	at com.sun.enterprise.connectors.inbound.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:171)
    	at $Proxy214.onMessage(Unknown Source)
    	at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:260)
    	at com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:114)
    	at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
    	at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
    Caused by: javax.resource.ResourceException: No such resource : topicfact
    	at com.sun.enterprise.connectors.ConnectionManagerImpl.validateResourceAndPool(ConnectionManagerImpl.java:430)
    	at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:171)
    	at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:165)
    	at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:160)
    	at com.sun.messaging.jms.ra.DirectConnectionFactory._allocateConnection(DirectConnectionFactory.java:543)
    	... 21 more

Discussions similaires

  1. Convertion fichier 2007 .accdb vers .mdb
    Par arcanes75 dans le forum Access
    Réponses: 7
    Dernier message: 17/07/2018, 07h11
  2. Copie d'un fichier local vers un serveur distant
    Par Contact2012 dans le forum VBScript
    Réponses: 4
    Dernier message: 20/07/2010, 14h38
  3. Modifications de base locale vers base distante
    Par cmoiscrat dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/09/2009, 15h31
  4. page html locale vers serveur distant
    Par milimelo dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 09/06/2008, 09h15
  5. XLS vers MDB sous runtime
    Par tomo0013 dans le forum Runtime
    Réponses: 13
    Dernier message: 06/02/2007, 14h06

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