具有多个代理的 JMSTemplate。目的地解析异常
Posted
技术标签:
【中文标题】具有多个代理的 JMSTemplate。目的地解析异常【英文标题】:JMSTemplate with multiple brokers. Destination resolving exception 【发布时间】:2019-06-08 16:54:40 【问题描述】:我有一整天都在尝试解决的问题,但没有成功... 我有一个应用程序尝试向外部系统 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 也已启动并运行。
-
我正在检索相关的、已经初始化的 JMSProducer,我已经在其中注入了带有destinationName 的JMSTemplate。
向外部系统 A 的队列发送消息
再次检索与系统 B 相关的 JMSProducer 的下一个实例
向外部系统 B 的队列发送消息
在这个阶段一切都很好,所有消息都传递到外部系统中的相关队列。
现在我再次获得与外部系统 A 相关的 JMSProducer,并尝试将消息发送到其中一个队列。而在这个阶段我有一个问题,DestinationResolutionException 被抛出:
在 JNDI 中找不到目标 [topic2.queueName]
javax.naming.NameNotFoundException:尝试查找“topic2.queueName”时未找到子上下文“topic2”。已解决“”
怎么可能,我刚刚向具有相同目的地的外部系统 A 发送了消息,它工作正常。为什么在我尝试将消息发送到 B 后向 A 发送消息时会引发异常?
顺便说一句,如果我在定义目标解析器时尝试将缓存标志更改为 true,它正在解决这个问题。但是在这种情况下,当我的外部系统要重新启动时,我开始遇到问题。重新启动后,它也有一些与目标解析相关的异常。
【问题讨论】:
【参考方案1】:解决了。
问题是在两个外部系统中,在 WLS 中 - 域名、jms 服务器名称和 jms 模块名称相同。并且 weblogic 客户端存储状态,使用此名称映射。
这是来自 WLS 文档
互操作的 WebLogic Server 域具有以下特性 限制:
域名必须是唯一的。
WebLogic 服务器名称必须是唯一的,即使它们位于两个 不同的域。
JMS 服务器名称必须是唯一的,即使它们位于两个不同的 域。
互操作域可能有特殊的安全注意事项。
https://docs.oracle.com/cd/E28280_01/web.1111/e13738/best_practice.htm#JMSAD635
更改上述所有名称后 - 问题解决了。
【讨论】:
以上是关于具有多个代理的 JMSTemplate。目的地解析异常的主要内容,如果未能解决你的问题,请参考以下文章
Robots.txt - 多个用户代理的抓取延迟的正确格式是啥?
Spring JMS 中的 JmsTemplate 回调是啥?