Шаблон JMS с несколькими брокерами. Назначение, разрешающее исключение - PullRequest
0 голосов
/ 14 января 2019

У меня есть проблема, которую я пытаюсь решить весь день, но безуспешно ... У меня есть приложение, которое пытается отправлять / получать сообщения на внешнюю систему A и на внешнюю систему B и от нее. A и B это внешние системы на основе WLS.

Пока мое приложение запускается - я читаю все конфигурации и собираю свой прикладной JMSProducer и внедряю JMSTemlate с предопределенным именем назначения в нем.

Вот мой код:

private JMSProducer initProducer(Conf conf) {
    DestinationResolver destinationResolver = getDestinationResolver(conf);
    ConnectionFactory connectionFactory = getConnectionFactory();
    String destinationName = conf.getDestinationName();
    JmsTemplate jmsTemplate = new JmsTemplate();
    jmsTemplate.setConnectionFactory(connectionFactory);
    jmsTemplate.setDestinationResolver(destinationResolver);
    jmsTemplate.setDefaultDestinationName(destinationName);
    return new JMSProducer(jmsTemplate);
}

public DestinationResolver getDestinationResolver(Conf conf) {
    JndiDestinationResolver destinationResolver = new JndiDestinationResolver();
    destinationResolver.setCache(false);
    destinationResolver.setJndiTemplate(getJNDITemplate(conf));
    return destinationResolver;
}

private JndiTemplate getJNDITemplate(Conf conf) {
    JndiTemplate jndiTemplate = new JndiTemplate();
    Properties properties = new Properties();
    String connectionFactoryClassName = externalSystemConf.getConnectionParam().getConnectionFactory();
    properties.setProperty("java.naming.factory.initial", connectionFactoryClassName);
    properties.setProperty("java.naming.provider.url", getProviderURL(conf.getConnectionParam()));
    jndiTemplate.setEnvironment(properties);
    return jndiTemplate;
}

Теперь сценарий того, что происходит.

Мое приложение запущено, внешняя система A с 2 очередями и внешняя система B с 1 очередью также запущены.

  1. Я получаю релевантный, уже инициализированный JMSProducer, в который я уже внедрил JMSTemplate с destinationName.
  2. Отправка сообщений в очереди внешней системы A
  3. Снова получить следующий экземпляр JMSProducer, относящийся к системе B
  4. Отправка сообщений в очередь внешней системы B
  5. На этом этапе все хорошо, все сообщения доставляются в соответствующие очереди во внешних системах.
  6. Теперь я снова получаю JMSProducer, относящийся к внешней системе A, и пытаюсь отправить сообщения в одну из очередей. И на этом этапе у меня есть проблема, исключение DestinationResolutionException:

Место назначения [topic2.queueName] не найдено в JNDI

javax.naming.NameNotFoundException: при попытке поиска 'topic2.queueName' не удалось найти подконтекст 'topic2'. Решено ""

Как это возможно, я только что отправил сообщения во внешнюю систему A с тем же адресатом, и он работал нормально. Почему возникает исключение, когда я отправляю сообщение A после того, как попытался отправить его B?

Кстати, если я попытаюсь изменить флаг кеша на true при определении резольвера назначения, это решит эту проблему. Однако в этом случае у меня начинаются проблемы, когда моя внешняя система будет перезагружена. После перезапуска также возникает исключение, связанное с разрешением пункта назначения.

1 Ответ

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

решаемая.

Проблема заключалась в том, что в обеих внешних системах в WLS имя домена, имя сервера jms и имя модуля jms были одинаковыми. И клиент weblogic хранит состояние, карту с этими именами.

Это из документации WLS

Взаимодействующие домены WebLogic Server имеют следующие Ограничения:

Доменные имена должны быть уникальными.

Имена серверов WebLogic должны быть уникальными, даже если они в двух разные домены.

Имена серверов JMS должны быть уникальными, даже если они находятся в двух разных домены.

Взаимодействующие домены могут иметь особые соображения безопасности.

https://docs.oracle.com/cd/E28280_01/web.1111/e13738/best_practice.htm#JMSAD635

После изменения всех вышеперечисленных имен - проблема решена.

...