2009-08-25 11 views
7

Según tengo entendido, se requiere un contenedor J2EE para incluir un proveedor JMS. ¿Es posible que una aplicación Java independiente envíe mensajes a una cola JMS proporcionada por el contenedor? Si es así, ¿cómo accedo a las búsquedas JNDI desde fuera del contenedor?¿Puedo enviar mensajes a una cola JMS desde fuera del servidor de la aplicación?

(Estoy tratando esto con Geronimo si hace alguna diferencia, pero estoy esperando que hay una manera estándar de hacer esto.)

Respuesta

5

Usted debe ser capaz de crear un InitialContext que utiliza el servidor JNDI en Geronimo. Luego puede usar esto para buscar su JMS Connection Factory and Queue.

El siguiente ejemplo fue adaptado de http://forums.sun.com/thread.jspa?threadID=5283256 para utilizar la Fábrica JNDI de Geronimo.

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); 
     } 
    } 
} 
+0

Es posible que desee agregar que esto supone que tiene un JNDI local ejecutándose. – Robin

0

Puede colocar mensajes en una cola JMS sin un servidor de aplicaciones.

Sin embargo, necesitará saber cómo llegar al proveedor JMS directamente, sin usar JNDI, ya que es proporcionado por el servidor de aplicaciones JavaEE.

0

Puede hacerlo, y puede haber varias formas dependiendo del thin client que está accediendo a la cola. El ejemplo dado por @pjp funcionará siempre que tenga los archivos jar correctos para acceder al servidor en cuestión, incluido un jar que proporcionará a su aplicación una instancia JNDI. Estos frascos deben ser provistos por el proveedor, y pueden incluir instrucciones sobre cómo conectarse sin usar JNDI también. Aunque creo que el método JNDI es el más simple y mantiene la codificación constante tanto dentro como fuera del servidor.

Cada proveedor tendrá diferentes jar para proporcionar acceso de cliente, en el caso de IBM, son diferentes para el proveedor JMS interno frente a WebSphere MQ (ya que son dos implementaciones diferentes).

Cuestiones relacionadas