ActiveMQ: problema con la ricerca della coda
Domanda
Ho impostato una coda configurandola in activemq.xml (ActiveMQ versione 5.2.0) come descritto in documentazione .
<destinations>
<queue physicalName="FOO.BAR" />
<queue physicalName="DUMMY" />
</destinations>
Sto provando ad accedervi da Java (sullo stesso host) con il seguente codice:
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);
Ricevo il seguente errore, sebbene la coda sia visibile in jconsole (Tree / org.apache.activemq / Queue):
javax.naming.NameNotFoundException: DUMMY
Per favore, dimmi cosa sto facendo di sbagliato. Molte, molte grazie!
Soluzione
Innanzitutto non è necessario creare esplicitamente alcuna coda in il broker sebbene non faccia alcun danno.
Inoltre le destinazioni disponibili nel broker non vengono mappate automaticamente in un contesto JNDI usando un qualche tipo di nome JNDI.
Puoi farlo esplicitamente come descritto qui . Se si desidera una popolazione auto-magica di JNDI, utilizzare la convenzione di denominazione JNDI di dynamicQueues / DUMMY come nome JNDI che si cerca (come descritto in Creazione dinamica di destinazioni )
Altri suggerimenti
Hmm .. bene quando voglio ascoltare una coda di solito faccio qualcosa del genere. (Importazioni da javax.jms)
Coda di coda;
// 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();
E assicurati che il tuo gestore implementa MessageListener.