Почему мой поиск JNDI для QueueConnectionFactory, возвращая пустой указатель?

Попробуйте это:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
7
задан Simon Nickerson 26 August 2009 в 08:46
поделиться

3 ответа

Причина, по которой он не генерирует исключение, заключается в том, что - существует исключение ClassLoadException, которое возникает при доступе к ресурсу.

И причина, по которой это происходит, потому что класс: com. sun.jndi.url.jca.jcaURLContextFactory ищется ClassLoader, вызываемым из ResourceManager.

Если вы измените имя Factory на какое-то другое имя, вы увидите исключение NamingException, но в случае поиска для таких исключений как ClassNotFound / IllegalState - исключения не возникают.

Таким образом, необходимо проанализировать зависимости ActiveMQ. Обновление1: одна из возможных причин заключается в том, что объект фабрики может быть создан только в управляемой среде. Вы запускаете свой код как клиент приложения?.

Update2: Были найдены некоторые другие указатели на причину такого поведения:

только реализация openejb jndi предоставляет ejbs, а не какие-либо другие ресурсы. Если у вас есть клиент приложения j2ee и вы хотите использовать jms, вам необходимо развернуть копию адаптера activemq на клиенте. Затем вы можете использовать j2ee java: comp / env context для поиска ваши вещи.

Обнаружено на сайте ActiveMQ:

Реализация JNDI ActiveMQ НЕ взаимодействует с сервером имен. Это урезанная версия клиента JNDI, которая просто позволяет получать темы и Очереди прямо из экземпляра JMS. Таким образом, вместо указания адреса сервера именования вам необходимо указать адрес сервера JMS. Большинство реализаций JNDI используют свойство java.naming.provider.url для указания адреса сервера именования. ActiveMQ использует URL-адрес брокера . Использование java.naming.provider.url вместо этого приведет к тому, что ActiveMQ попытается загрузить весь брокер.

Подробнее о том, как Подключиться с помощью JNDI :

Исходная фабрика контекста, используемая в объяснении: org.apache.activemq.jndi.ActiveMQInitialContextFactory

Пример кода для тестирования с JNDI можно найти здесь

Я написал простой java-клиент - обратите внимание, что ниже URL-адрес поставщика - это URL-адрес брокера, который используется.

    Properties props = new Properties();            
props.put(Context.INITIAL_CONTEXT_FACTORY,
             "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
    //props.put(Context.PROVIDER_URL,"vm://localhost");//Either this or below
    props.put(Context.PROVIDER_URL,"tcp://localhost:65432"); 
    props.put("queue.SendReceiveQueue",
         "org.apache.geronimo.configs/activemq-ra/JCAAdminObject/SendReceiveQueue");

    InitialContext context = new InitialContext(props);   
    QueueConnectionFactory connectionFactory = (QueueConnectionFactory)context.lookup
                                                               ("ConnectionFactory");
    Queue q = (Queue) context.lookup("SendReceiveQueue");
    System.out.println("conn is : "  + connectionFactory.getClass().getName());
    System.out.println("queue is : " + q.getQueueName());

Эта программа дает вывод:

conn is: org.apache.activemq .ActiveMQConnectionFactory очередь: org.apache.geronimo.configs / activemq-ra / JCAAdminObject / SendReceiveQueue

13
ответ дан 6 December 2019 в 14:06
поделиться

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

  • исследовать пространство имен - что там? Есть ли у вас какие-либо инструменты просмотра JNDI?
  • внимательно посмотрите журналы службы, которая должна регистрироваться в JNDI, сообщает ли она об ошибках?
0
ответ дан 6 December 2019 в 14:06
поделиться

У меня есть несколько эквивалентная конфигурация Tomcat / Geronimo J2EE jar / Geronimo JMS Jar / ActiveMQ 4 И я немного запутался в вашем файле jndi.propertie. Мой выглядит так:

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory

java.naming.provider.url = tcp: // localhost: 61616

connectionFactoryNames = connectionFactory, TopicConnectionFactory

Большая разница в том, что ваш исходный контекст удален. Кроме того, я должен предоставить connectionFactoryNames, иначе я получу NamingException.

1
ответ дан 6 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: