Вопрос

Я пытаюсь создать просто соединение с 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-адрес провайдера, например, из другого места.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top