ActiveMQ: проблема с поиском очереди
Вопрос
Я настроил очередь, настроив ее в activemq.xml (ActiveMQ версия 5.2.0), как описано в документация .
<destinations>
<queue physicalName="FOO.BAR" />
<queue physicalName="DUMMY" />
</destinations>
Я пытаюсь получить доступ к нему из Java (на том же хосте) с помощью следующего кода:
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);
Я получаю следующую ошибку, хотя очередь видна в jconsole (Tree / org.apache.activemq / Queue):
javax.naming.NameNotFoundException: DUMMY
Пожалуйста, скажи мне, что я делаю не так. Большое, большое спасибо!
Решение
Во-первых, вам не нужно явно создавать любые очереди в брокер , хотя это не причиняет вреда.
Кроме того, пункты назначения, доступные в посреднике, автоматически не отображаются в контекст JNDI для вас, используя какое-то имя JNDI.
Вы можете сделать это в явном виде, как описано здесь . Если вы хотите использовать автоматическое магическое заполнение JNDI, используйте соглашение по именованию JNDI dynamicQueues / DUMMY в качестве имени JNDI, которое вы ищете (как описано в Динамически создаваемые места назначения )
Другие советы
Хм .. ну, когда я хочу послушать очередь, я обычно делаю что-то вроде этого. (Импорт из javax.jms)
Очередь в очереди;
// 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();
И убедитесь, что ваш обработчик реализует MessageListener.