Использование ActiveMQ через JNDI
Вопрос
Я пытаюсь создать просто соединение с ActiveMQ, используя JNDI. Р> <ч> У меня есть
<Ол>
Очередь с именем 'example.A'.
Согласно документации ActiveMQ, касающейся JNDI , если я хочу использовать ConectionFactories и Очереди (темы) через JNDI, я должен поместить файл jndi.properties в мой путь к классам. Как я понял, путь к классу activeMQ по умолчанию является каталогом% activemq% / conf. Я не изменил это. Итак, у меня есть это свойство для моей очереди:
queue.MyQueue = example.A
Я создал клиентский класс Java для ActiveMQ, который использует JNDI, как показано ниже:
Properties jndiParameters = new Properties() ;
jndiParameters.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
jndiParameters.put(Context.PROVIDER_URL, "tcp://localhost:61616");
Context context = new InitialContext(jndiParameters);
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory");
Queue queue = (Queue) context.lookup("MyQueue");
но он не может найти мою очередь, он выдает исключение: javax.naming.NameNotFoundException: MyQueue
Где мои ошибки?
Решение
Проблема в том, что вы явно создаете свойства и передаете их в конструктор InitialContext. Это означает, что jndi.properties в пути к классам не будут прочитаны.
Ваш код должен выглядеть примерно так:
Context context = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory");
Queue queue = (Queue) context.lookup("MyQueue");
Другие советы
Вы можете установить статические свойства, а также извлечь их из файла следующим образом:
InputStream is = getClass().getResourceAsStream("/my.jndi.properties");
Properties jndiParameters = new Properties();
jndiParameters.load(is);
jndiParameters.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
jndiParameters.put(Context.PROVIDER_URL, "tcp://localhost:61616");
Context ctx = new InitialContext(jndiParameters);
...
Это работает до тех пор, пока вы устанавливаете статический реквизит после загрузки ресурса. Полезно, если вы загружаете URL-адрес провайдера, например, из другого места.