Причина, по которой он не генерирует исключение, заключается в том, что существует исключение ClassLoadException, возникающее при обращении к ресурсу.
И причина, по которой это происходит, потому что класс: com.sun.jndi.url.jca.jcaURLContextFactory ищется ClassLoader, вызываемым из ResourceManager.
Если вы измените имя фабрики на какое-то другое имя, вы увидите исключение NamingException, но в случае поиска исключений, таких как ClassNotFound / IllegalState, исключений не возникает.
Таким образом, необходимо проанализировать зависимости ActiveMQ.
Обновление 1. Одна из возможных причин заключается в том, что объект фабрики может быть создан только в управляемой среде. Вы запускаете свой код как клиент приложения?.
Update2: некоторые другие указатели, найденные для причины этого поведения:
только реализация openejb jndi
выставляет ejbs, а не любые другие ресурсы.
Если у вас есть клиент приложения j2ee, и
Вы хотите использовать JMS, вам нужно
развернуть копию адаптера activemq
на клиенте. Затем вы можете использовать
j2ee java: контекст comp / env для поиска
ваши вещи.
Найдено на сайте ActiveMQ:
Реализация ActiveMQ JNDI НЕ взаимодействует с сервером имен. Это
урезанная версия клиента JNDI, которая просто позволяет получить темы и
Очереди напрямую из экземпляра JMS. Таким образом, вместо предоставления адреса сервера имен, вы должны указать адрес сервера JMS. Большинство реализаций JNDI используют свойство java.naming.provider.url для указания адреса сервера имен. ActiveMQ использует brokerURL . Использование вместо этого java.naming.provider.url приведет к тому, что ActiveMQ попытается загрузить весь брокер.
Подробнее о том, как подключиться с помощью JNDI :
Исходная фабрика контекста, использованная в объяснении: org.apache.activemq.jndi.ActiveMQInitialContextFactory
Некоторые примеры кода для тестирования с JNDI можно найти здесь
Я написал простой Java-клиент - примечание под URL-адресом провайдера - это brokerURL, который используется.
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