Шаблон JMS с несколькими брокерами. Назначение, разрешающее исключение
У меня есть проблема, которую я пытаюсь решить весь день, но безуспешно... У меня есть приложение, которое пытается отправлять / получать сообщения во внешнюю систему 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 очередью также запущены.
- Я получаю релевантный, уже инициализированный JMSProducer, в котором я уже внедрил JMSTemplate с destinationName.
- Отправка сообщений в очереди внешней системы A
- Снова получить следующий экземпляр JMSProducer, соответствующий системе B
- Отправка сообщений в очередь внешней системы B
- На этом этапе все хорошо, все сообщения доставляются в соответствующие очереди во внешних системах.
- Теперь я снова получаю JMSProducer, который имеет отношение к внешней системе A, и пытаюсь отправить сообщения в одну из очередей. И на этом этапе у меня есть проблема, исключение DestinationResolutionException:
Пункт назначения [topic2.queueName] не найден в JNDI
javax.naming.NameNotFoundException: при попытке поиска 'topic2.queueName' не нашел подконтекст 'topic2'. Решено ""
Как это возможно, я только что отправил сообщения во внешнюю систему A с тем же адресатом, и он работал нормально. Почему возникает исключение, когда я отправляю сообщение A после того, как попытался отправить его B?
Кстати, если я попытаюсь изменить флаг кеша на true при определении конечного распознавателя, это решит эту проблему. Однако в этом случае у меня начинаются проблемы, когда моя внешняя система будет перезагружена. После перезапуска также есть некоторые исключения, связанные с разрешением пункта назначения.
1 ответ
Решаемые.
Проблема заключалась в том, что в обеих внешних системах в WLS имя домена, имя сервера jms и имя модуля jms были одинаковыми. И клиент weblogic хранит состояние, карту с этими именами.
Это из документации WLS
Взаимодействующие домены WebLogic Server имеют следующие ограничения:
Доменные имена должны быть уникальными.
Имена серверов WebLogic должны быть уникальными, даже если они находятся в двух разных доменах.
Имена серверов JMS должны быть уникальными, даже если они находятся в двух разных доменах.
Взаимодействующие домены могут иметь особые соображения безопасности.
https://docs.oracle.com/cd/E28280_01/web.1111/e13738/best_practice.htm
После изменения всех вышеперечисленных названий проблема была решена.