У меня есть проблема, которую я пытаюсь решить весь день, но безуспешно ...
У меня есть приложение, которое пытается отправлять / получать сообщения на внешнюю систему 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 при определении резольвера назначения, это решит эту проблему. Однако в этом случае у меня начинаются проблемы, когда моя внешняя система будет перезагружена. После перезапуска также возникает исключение, связанное с разрешением пункта назначения.