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

Пожалуйста, скажите мне, что я делаю неправильно. Большое большое спасибо!


person MrG    schedule 12.01.2009    source источник


Ответы (2)


Во-первых, вам не нужно явно создавать какие-либо очереди в брокере хотя это и не вредит.

Кроме того, адресаты, доступные в брокере, не автоматически волшебным образом сопоставляются с контекстом JNDI для вас, используя какое-либо имя JNDI.

Вы можете сделать это в явном виде, как описано здесь. Если вы хотите автоматическое магическое заполнение JNDI, используйте соглашение об именовании JNDI dynamicQueues/DUMMY в качестве имени JNDI, которое вы ищете (как описано в файле Динамическое создание направлений)

person James Strachan    schedule 12.01.2009
comment
Спасибо, что объяснили, что существует разница между созданием темы/очереди и ее сопоставлением с контекстом JNDI. Я подозреваю, что проблема соединения очереди/темы, которую мы пытаемся решить, коренится в предположении, что создание == регистрация JNDI. - person Stephen Harmon; 18.11.2009

Хм... ну, когда я хочу послушать Queue, я обычно делаю что-то вроде этого. (Импорт из 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.

person Bernie Perez    schedule 12.01.2009
comment
Спасибо, Берни. Проблема в том, что у вас есть специальный код ActiveMQ, те, которые я перечислил выше, прекрасно работают и с другими реализациями JMS, то есть с OpenJms. - person MrG; 13.01.2009