我遇到了整日试图解决的问题,但没有成功... 我有一个应用程序试图与外部系统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;
}
现在场景会发生什么。
我的应用程序已启动并正在运行,具有2个队列的外部系统A和具有1个队列的外部系统B也已启动并正在运行。
在JNDI中找不到目标[topic2.queueName]
javax.naming.NameNotFoundException:尝试查找“ topic2.queueName”时未找到子上下文“ topic2”。已解决“”
这是怎么可能的,我刚刚将消息发送到了具有相同目的地的外部系统A,并且工作正常。为什么在尝试将消息发送到B后向A发送消息时会抛出异常?
顺便说一句,如果在定义目标解析器时尝试将缓存标志更改为true,则可以解决此问题。但是,在这种情况下,我的外部系统将要重新启动时开始出现问题。重新启动后,它也有一些与目标解析有关的异常。
答案 0 :(得分:0)
已解决。
问题是在两个外部系统中,在WLS中,域名,jms服务器名称和jms模块名称都相同。并且weblogic客户端存储状态,并使用该名称进行映射。
这来自WLS文档
互操作的WebLogic Server域具有以下内容 限制:
域名必须唯一。
WebLogic服务器名称必须唯一,即使它们是两个 不同的域。
JMS服务器名称必须唯一,即使它们是两个不同的名称也是如此 域。
互操作域可能有特殊的安全注意事项。
https://docs.oracle.com/cd/E28280_01/web.1111/e13738/best_practice.htm#JMSAD635
更改所有上述名称后-问题已解决。