2009-01-12 10 views
6

Configuré una cola configurándola en activemq.xml (ActiveMQ versión 5.2.0) como se describe en documentation.ActiveMQ: Problema con la búsqueda en cola

<destinations> 
    <queue physicalName="FOO.BAR" /> 
    <queue physicalName="DUMMY" /> 
</destinations> 

Estoy tratando de acceder a él desde Java (en el mismo host) con el siguiente código:

Hashtable properties = new Hashtable(); 
properties.put(Context.INITIAL_CONTEXT_FACTORY, 
    "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); 
properties.put(Context.PROVIDER_URL, "tcp://localhost:61616"); 

context = new InitialContext(properties); 

factory = (ConnectionFactory) context.lookup("ConnectionFactory"); 
connection = factory.createConnection(); 
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
queueName = "DUMMY"; // which can be either FOO.BAR or DUMMY 
dest = (Destination) context.lookup(queueName); 

estoy receveing ​​el siguiente error, aunque la cola es visible en jconsole (Tree/org.apache.activemq/Queue):

javax.naming.NameNotFoundException: DUMMY 

Por favor, dime qué estoy haciendo mal. ¡Muchas muchas gracias!

Respuesta

8

En primer lugar, no es necesario que explicitly create any queues in the broker aunque no hace daño.

También los destinos disponibles en el intermediario no se mapean automáticamente en un contexto JNDI para usted utilizando algún tipo de nombre JNDI.

Puede hacerlo explicitly as described here. Si quieres población de auto-mágico de JNDI a continuación, utilizar la convención de nombres JNDI de dynamicQueues/DUMMY como el nombre JNDI que las operaciones de búsqueda (como se describe en el Dynamically creating destinations)

+0

Gracias por explicar que existe una diferencia entre crear un tema/cola y asignarlo a un contexto JNDI. Sospecho que un problema de conexión de cola/tema que estamos tratando de resolver tiene sus raíces en el supuesto de que la creación == registro JNDI. –

0

Hmm .. bueno cuando quiero escuchar una cola Usualmente hago algo como esto. (Importaciones desde javax.jms)

Queue queue;

// Connect to ActiveMQ 
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(messageBrokerURL); 
    connection = factory.createConnection(); 
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

    // List to Dummy Queue 
    queue = session.createQueue("DUMMY"); 
    messageConsumer = session.createConsumer(queue); 
    messageConsumer.setMessageListener(queueHandler); 

    // Start the connection 
    connection.start(); 

Y asegúrese de que su controlador implementa MessageListener.

+0

Gracias Bernie. El problema con eso es que tienes un código específico de ActiveMQ, los que he enumerado anteriormente funcionan perfectamente bien con otras implementaciones JMS también, es decir, con OpenJms. – MrG

Cuestiones relacionadas