【问题标题】:Configuring JBoss JNDI to bind to JNDI on different server?配置 JBoss JNDI 以绑定到不同服务器上的 JNDI?
【发布时间】:2023-03-06 20:05:01
【问题描述】:

我有两个 JBoss 服务器,JbossA 和 JbossB。每个都有自己的 JNDI。现在我在 JbossA 上有一个名为 jms/Client 的 JMS,在 JbossB 上有一个名为 jms/Server 的 JMS。

现在我希望 JbossA 上的应用程序能够使用自己的 JNDI 访问 jms/Server。此外,我希望 JbossB 上的应用程序使用自己的 JNDI 使用 jndi 名称 jms/Client1 访问 jms/Client。

简而言之:

JbossA/
       JNDI/
            jms/Client
            jms/Server  -> JbossB/JNDI/jms/Server


JbossB/
       JNDI/
            jms/Server
            jms/Client1  -> JBossA/JNDI/jms/Client
  • JbossA 上的 AppA 使用 JbossA/JNDI 访问 jms/Client 和 jms/Server
  • JbossB 上的 AppB 使用 JbossB/JNDI 访问 jms/Server 和 jms/Client1

两个问题:

  1. 有可能吗?
  2. 如果是这样,我将如何在 JBoss EAP 6.0.1 (Jboss 7.1) 中进行配置?

【问题讨论】:

  • 这纯粹是一个应用程序/jndi 问题。我正在删除 hornetq 标签
  • 你是对的。道歉...

标签: jboss jms jboss7.x jndi


【解决方案1】:

首先,我想不出您想要查找 MDB 的充分理由,这些应该仅由容器调用(准确地说是由 JMS 实现),但如果您是尝试查找 JMS 发布者或连接,那么您的要求完全有道理。

话虽如此,JBoss 7 引入了一个不错的新功能,Remote Naming Project 完全符合您的需求,但问题是,显然它只能绑定远程 EJB,您可以尝试一下。我个人认为 JBoss 团队(我非常感谢他们做出了如此出色的工作)在这方面有点落后(也许他们有充分的理由?),其他 JEE 容器已经能够做到这已经有一段时间了,在Weblogic中它被称为Foreign JNDI Binding,但无论如何,如果上述方法不起作用并且您绝对需要这样做,恐怕剩下的唯一解决方案就是以编程方式进行,在这种情况下保持阅读下文。

javax.naming API 提供了一种将引用绑定到本地命名上下文之外的对象的方法,只需使用InitialContext.bind(String name, Object obj),而不是绑定实际对象绑定javax.naming.Reference 的实例。正如您从 javadocs 中看到的那样,要创建 Reference 实例,您需要提供 javax.naming.RefAddr 的实现实例,其中包含定位远程对象所需的信息和 javax.naming.spi.ObjectFactory 的实现,这是底层的对象将进行实际查找以获取您的远程对象。它看起来像这样:

InitialContext ctx = new InitialContext();
ForeignJNDIObjectRefAddr refAddr = getRemoteObjectJNDIInfo(...;
ctx.bind("jms/Server", new Reference("java.lang.Object",
                refAddr, ForeignJNDIObjectFactory.class.getName(), null));

在这种情况下,您将实现 ForeignJNDIObjectRefAddrForeignJNDIObjectFactory,当需要进行查找时,您的 ForeignJNDIObjectFactory.getObjectInstance 方法将被调用,并以 ForeignJNDIObjectRefAddr 实例作为其第一个参数,这样您就有了查找并返回远程对象的所有必要信息。祝你好运!

【讨论】:

  • 我没有提到 MDB 吗?我想查找 JMS 连接。我知道 EJB 的远程命名项目,但不幸的是,这对我的 JMS 没有用处。此外,我不希望使用 java 绑定远程 JMS,因为我希望它(对于应用程序)对 JMS 的来源完全透明。应用程序联系一个 JNDI,它提供了他所要求的......无论如何,这就是这个想法。
  • 是的,你想查找连接,这就是我的想法。另一方面,就像我说的,如果您不想为许可证付费,据我所知,您似乎没有太多其他选择。关于程序化方法,这正是使您的业务不必知道 JMS 来自哪里的方法,它可以全部集中,从配置加载,并且只需执行一次,您实现它的方式是完全取决于你,我只描述了基本机制。
【解决方案2】:

这是可能的。如果你可以升级你的 EAP 版本会更容易。如果您订阅了 EAP,我看不出保留旧版本的理由。从那以后修复了很多错误。

来自EAP 6.2.0 release notes

外部 JNDI 联合

命名子系统配置已添加到 JBoss EAP 6 配置中 使管理员能够连接外部 JBoss EAP 6 JNDI 的命名系统。此功能取代了 来自 JBoss EAP 5 的 ExternalContextMBean。

但是,即使使用 EAP 6.0.x,您也可以使用

<subsystem xmlns="urn:jboss:domain:naming:1.2">
    <bindings>
        <object-factory name="java:global/myExtContext" module="my.custom.module" class="my.example.class.ExternalContextObjectFactory"/>
    </bindings>
    <remote-naming/>
</subsystem>

并在 my.custom.module 模块中实现 ExternalContextObjectFactory 像

public class ExternalContextObjectFactory implements ObjectFactory {
    @Override
    public Object getObjectInstance(final Object obj, final Name name, final Context nameCtx, final Hashtable<?, ?> environment) throws Exception {
      Hashtable env = new Hashtable();
      if(environment != null)
        env.putAll(environment);
      env.set( /* all the properties you will need for your target context */ );
      return new InitialContext(environment);
    }
} 

所以你的目标上下文将绑定到java:global/myExtContext

【讨论】:

    【解决方案3】:

    使用 EAP 6.x 中包含的外部 JNDI 联合是可行的。您需要定义一个全局绑定属性。休息是你去探索:)

    希希尔

    【讨论】:

      猜你喜欢
      • 2016-02-23
      • 1970-01-01
      • 2014-03-29
      • 2014-11-06
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多