具有多个代理的 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 回调是啥?

在具有多个目的地的移动设备上启动地图应用程序

用于 Unity 对话系统目的的 XML 解析具有属性的嵌套对象

AOP静态代理解析1-标签解析