ActiveMQ: problema con la búsqueda de cola
Pregunta
He configurado una cola configurándola en activemq.xml (ActiveMQ versión 5.2.0) como se describe en documentación .
<destinations>
<queue physicalName="FOO.BAR" />
<queue physicalName="DUMMY" />
</destinations>
Estoy intentando acceder 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);
Recibo el siguiente error, aunque la cola está visible en jconsole (Tree / org.apache.activemq / Queue):
javax.naming.NameNotFoundException: DUMMY
Por favor dime qué estoy haciendo mal. Muchas, muchas gracias!
Solución
En primer lugar, no tiene que crear explícitamente ninguna cola en el corredor aunque no hace daño.
Además, los destinos disponibles en el intermediario no se asignan automáticamente en un contexto JNDI para que usted use algún tipo de nombre JNDI.
Puede hacer esto explícitamente como se describe aquí . Si desea una población auto-mágica de JNDI, use la convención de nomenclatura JNDI de dynamicQueues / DUMMY como el nombre JNDI que busca (como se describe en Creación dinámica de destinos )
Otros consejos
Hmm ... bueno, cuando quiero escuchar una cola, generalmente hago algo como esto. (Importaciones de javax.jms)
Cola de cola;
// 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 implemente MessageListener.