Попытка работать с разными удаленными источниками данных. Ошибка - jndi разрешить исключение
У меня есть приложение, развернутое на tomcat, которое пытается работать с удаленными очередями JMS внешней системы A и B. Внешние системы развернуты в Weblogic, поэтому для связи с ними я также предоставляю wlthint3client.
Это мой код:
public void myMethod () {
// Sending message to first ext system
// jndi queue name - topic1.extsys1.tosend.messages
magicMethod(Params of External system A);
// Sending message to second ext system
// jndi queue name - topic1.extsys2.tosend.messages
magicMethod(Params of External system B);
// AGAIN Sending message to FIRST ext system
// jndi queue name - topic1.extsys1.tosend.messages
magicMethod(Params of External system A);
}
private void magicMethod(String factoryName, String url, String connectionFactoryJNDI, String queueName) throws Exception {
javax.jms.QueueConnectionFactory queueConnectionFactory = null;
javax.jms.QueueSession queueSession = null;
javax.jms.Queue queue = null;
javax.jms.QueueSender queueSender = null;
javax.jms.QueueConnection queueConnection = null;
InitialContext ic = null;
try {
final Properties initialContextProperties = new Properties();
initialContextProperties.put(Context.INITIAL_CONTEXT_FACTORY, factoryName);
initialContextProperties.put(Context.PROVIDER_URL, url);
initialContextProperties.put(Context.SECURITY_PRINCIPAL, "");
initialContextProperties.put(Context.SECURITY_CREDENTIALS, "");
ic = new InitialContext(initialContextProperties);
queueConnectionFactory = (QueueConnectionFactory) ic.lookup(connectionFactoryJNDI);
queue = (javax.jms.Queue) ic.lookup(queueName);
} catch (NamingException e) {
System.out.println("Could not create JNDI context: " + e.getMessage());
}
try {
queueConnection = queueConnectionFactory.createQueueConnection();
queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queueSender = queueSession.createSender(queue);
ObjectMessage objectMessage = queueSession.createObjectMessage("message");
queueSender.send(objectMessage);
} catch (JMSException e) {
System.out.println(e.getMessage());
} finally {
ic.close();
queueConnection.close();
queueSession.close();
queueSender.close();
}
}
Когда я отправляю сообщение в систему ext A - все в порядке. Отправка сообщения в систему ext B - сообщение отправлено, все в порядке.
При попытке СНОВА отправить сообщение в систему ext A - у меня не получается.
Не удалось создать контекст JNDI: при попытке поиска 'topic1.extsys1.tosend.messages' не удалось найти подконтекст 'extsys1'. Решено 'topic1'
Поэтому я пытаюсь понять:
- Что я сделал не так?
- Почему я не отправляю сообщения в систему A после того, как мне удалось отправить в систему ext B?
- Имеют ли эти внутренние java-объекты (InitialContext, JNDI-объекты и т. Д.) Какое-то состояние? Может мне нужно что-нибудь почистить?
- Я чувствую, что что-то напутало с именами JNDI...
- Может мне нужно поменять имена? (На самом деле я уже пытался иметь совершенно разные имена jndi-очереди, но это не имело никакого эффекта, однако я не перезагружал внешние системы, не уверен, требуется ли это).
Любые идеи, направления движения??? пожалуйста
Сервер ps - jms и модуль jms имеют одинаковые имена во внешних системах A и B. URL провайдера - ext1.xxx.corp.com
, ext2.xxx.corp.com
2 ответа
Это фиктивный код, просто чтобы описать ситуацию.
Ответ здесь - JMSTemplate с несколькими брокерами. Назначение, разрешающее исключение
Я не совсем уверен, почему поиск JNDI терпит неудачу. Объекты JNDI не имеют никакого состояния, по крайней мере, не в соответствии со спецификацией, но ваша конкретная реализация может иметь не специфическое поведение. Это также может быть просто ошибкой в вашей реализации JNDI.
Тем не менее, я могу сказать, что ваш код использует существенный анти-шаблон, поскольку он выполняет следующее для каждого отправляемого сообщения:
- Поиск JNDI (вероятно, требуется двусторонняя передача по сети)
- Создайте соединение JMS (конечно, требуется двусторонняя сеть)
- Создайте сеанс JMS (почти наверняка требуется сетевой обмен данными)
- Создать производителя JMS
Это значительная трата ресурсов. По крайней мере, вы должны кэшировать результаты ваших поисков JNDI (которые могут решить вашу проблему), а также ваших фабрик JMS-соединений. В идеале вы должны использовать пул для ваших соединений JMS.