7
votes

Puis-je envoyer des messages à une file d'attente JMS de l'extérieur du serveur d'applications?

Si je comprends bien, un conteneur J2EE est nécessaire pour inclure un fournisseur JMS. Est-il possible pour une application Java autonome d'envoyer des messages à une file d'attente JMS fournie par le conteneur? Si oui, comment accéder aux recherches JNDI de l'extérieur du conteneur?

(J'essaye-je avec Geronimo si cela fait une différence, mais j'espère qu'il existe une façon standard de le faire.)


0 commentaires

3 Réponses :


0
votes

Vous pouvez placer des messages dans une file d'attente JMS sans serveur d'applications.

Cependant, vous devez savoir comment accéder directement au fournisseur JMS - sans utiliser JNDI, car cela est fourni par le serveur d'applications Javaee.


0 commentaires

5
votes

Vous devriez être capable de créer un fort> initialContext strong> qui utilise le serveur JNDI STRAND> dans GERONIMO. Vous pouvez ensuite utiliser cela pour rechercher votre usine de connexion JMS et votre file d'attente.

L'exemple suivant a été adapté de http://forums.sun.com/thread.jspa?TridAdID=5283256 Pour utiliser l'usine Geronimo Jndi. P>

Context                  jndiContext = null;
ConnectionFactory   connectionFactory = null;
Connection             connection = null;
Session                  session = null;
Queue                    queue = null;
MessageProducer     messageProducer = null;   

try
{
    //[1] Create a JNDI API InitialContext object.
    Hashtable properties = new Hashtable(2);

    // CHANGE these to match Geronimos JNDI service

    properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
    properties.put(Context.PROVIDER_URL, "ejbd://127.0.0.1:4201");
    jndiContext = new InitialContext(properties);

    //[2] Look up connection factory and queue.
    connectionFactory = (ConnectionFactory)jndiContext.lookup("jms/ConnectionFactory");
    queue = (Queue)jndiContext.lookup("jms/Queue");

    //[3]
    // - Create connection
    // - Create session from connection; false means session is not transacted.
    // - Create sender and text message.
    // - Send messages, varying text slightly.
    connection = connectionFactory.createConnection();
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    messageProducer = session.createProducer(queue);

   //send a message
   TextMessage message = session.createTextMessage(this.jTextSend.getText()); 
   messageProducer.send(message); 

   //example for send some object
   //ObjectMessage message = session.createObjectMessage();
   //MyObj myObj = new MyObj ("Name"); //this class must be serializable 
   //message.setObject(myObj );
   //messageProducer.send(message);
}
catch(Exception ex)
{
   LOG.error(ex);
}
finally
{
     if(connection !=null)
     {
         try
         {
             connection.close();
         }
         catch(JMSException e)
         {
              LOG.error(e);
         }
     }
}


1 commentaires

Vous voudrez peut-être ajouter que cela suppose que vous avez une course JNDI locale.



0
votes

Vous pouvez le faire et il peut y avoir plusieurs façons, en fonction du client léger qui accède à la file d'attente. L'exemple donné par @PJP fonctionnera à la fourniture des fichiers JAR corrects pour accéder au serveur en question, y compris un pot qui fournira à votre application avec une instance JNDI. Ces pots doivent être fournis par le fournisseur et peuvent inclure des instructions sur la manière de se connecter sans utiliser JNDI. Bien que je pense que la méthode JNDI est la plus simple et conserve le codage cohérent à la fois sur et hors du serveur.

Chaque fournisseur aura des pots différents pour fournir un accès client, dans le cas d'IBM, ils sont différents pour le fournisseur JMS interne vs. WebSphere MQ (puisqu'il s'agit de deux implémentations différentes).


0 commentaires