Попытка работать с разными удаленными источниками данных. Ошибка - jndi разрешить исключение - PullRequest
0 голосов
/ 15 января 2019

У меня есть приложение, развернутое на 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'

Итак, я пытаюсь понять:

  1. Что я сделал не так?
  2. Почему он не отправляет сообщения в систему A, после того как мне удалось отправить в систему ext B?
  3. Имеют ли эти внутренние java-объекты (InitialContext, JNDI-объекты и т. Д.) Какое-то состояние? Может мне нужно что-нибудь почистить?
  4. Я чувствую, что что-то напутало с именами JNDI ...
  5. Может быть, мне нужно изменить имена? (На самом деле я уже пытался иметь совершенно разные имена jndi-очереди, но это не имело никакого эффекта, однако я не перезагружал внешние системы, не уверен, требуется ли это).

Есть идеи, как двигаться ??? Пожалуйста

ps - сервер jms и модуль jms имеют одно и то же имя во внешних системах A и B. URL провайдера - ext1.xxx.corp.com, ext2.xxx.corp.com

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Это фиктивный код, просто чтобы описать ситуацию.

Ответ здесь - Шаблон JMS с несколькими брокерами. Исключение разрешения пункта назначения

0 голосов
/ 16 января 2019

Я не совсем уверен, почему поиск JNDI не работает.Объекты JNDI не имеют никакого состояния, по крайней мере, не в соответствии со спецификацией, но ваша конкретная реализация может иметь не специфическое поведение.Это также может быть просто ошибкой в ​​вашей реализации JNDI.

Однако я могу сказать, что ваш код использует существенный анти-шаблон, поскольку он выполняет следующее для каждого отправляемого вами сообщения:

  • Поиск JNDI (вероятно, требуется двусторонняя передача по сети)
  • Создание подключения JMS (безусловно, требуется двусторонняя передача по сети)
  • Создание сеанса JMS (почти наверняка требуется обход в сеть)
  • Создание производителя JMS

Это значительная трата ресурсов.По крайней мере, вы должны кэшировать результаты ваших поисков JNDI (которые могут решить вашу проблему), а также ваших фабрик JMS-соединений.В идеале вы должны использовать пул для соединений JMS.

...