第 21 章 配置 Naming 子系统

21.1. 关于 Naming 子系统

naming 子系统为 JBoss EAP 提供了 JNDI 的实现。您可以配置这个子系统来绑定全局 JNDI 命名空间中的项。您也可以配置它来激活或取消激活远程 JNDI 接口

以下是一个包括了所有指定的项和属性的 naming 子系统 XML 配置示例。

<subsystem xmlns="urn:jboss:domain:naming:2.0">
    <bindings>
        <simple name="java:global/simple-integer-binding" value="100" type="int" />
        <simple name="java:global/jboss.org/docs/url" value="https://docs.jboss.org" type="java.net.URL" />
        <object-factory name="java:global/foo/bar/factory" module="org.foo.bar" class="org.foo.bar.ObjectFactory" />
        <external-context name="java:global/federation/ldap/example" class="javax.naming.directory.InitialDirContext" cache="true">
            <environment>
                <property name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory" />
                <property name="java.naming.provider.url" value="ldap://ldap.example.com:389" />
                <property name="java.naming.security.authentication" value="simple" />
                <property name="java.naming.security.principal" value="uid=admin,ou=system" />
                <property name="java.naming.security.credentials" value="secret" />
            </environment>
        </external-context>
        <lookup name="java:global/new-alias-name" lookup="java:global/original-name" />
    </bindings>
    <remote-naming/>
</subsystem>

21.2. 配置全局绑定

naming 子系统允许把项绑定到 java:globaljava:jbossjava 全局 JNDI 命名空间中。但是,推荐使用标准的、可移植的 java:global 命名空间。

全局绑定在 naming 子系统的 <bindings> 项中设置。现在支持 4 类绑定。

配置简单绑定

simple XML 配置项用来绑定 primitive 或 java.net.URL 项。

  • name 属性是必需的,它为这个条目指定目标 JNDI 名。
  • value 属性是必需的,它用来定义条目的值。
  • 可选的 type 属性用来指定这个条目值的类型,它的默认值是 to java.lang.String。除了 java.lang.String,还可用指定 primitive 类型以及它们相应的 object wrapper 类型,如 intjava.lang.Integer,以及 java.net.URL

以下是创建一个简单绑定的管理 CLI 命令的示例。

/subsystem=naming/binding=java\:global\/simple-integer-binding:add(binding-type=simple, type=int, value=100)

XML 配置的结果

<subsystem xmlns="urn:jboss:domain:naming:2.0">
    <bindings>
        <simple name="java:global/simple-integer-binding" value="100" type="int"/>
    </bindings>
    <remote-naming/>
</subsystem>

使用以下命令删除绑定。

/subsystem=naming/binding=java\:global\/simple-integer-binding:remove

绑定对象工厂

object-factory XML 配置项绑定 javax.naming.spi.ObjectFactory 条目。

  • name 属性是必需的,它为这个条目指定目标 JNDI 名。
  • class 属性是必需的,它用来定义对象工厂的 Java 类型。
  • module 属性是必需的,它指定了 JBoss Module ID,对象工厂的 Java 类会从这个 ID 所代表的地方加载。
  • environment 子项是可选的,它被用来为对象工厂提供一个自定义的环境。

以下是创建一个对象工厂绑定的管理 CLI 命令的示例。

/subsystem=naming/binding=java\:global\/foo\/bar\/factory:add(binding-type=object-factory, module=org.foo.bar, class=org.foo.bar.ObjectFactory, environment=[p1=v1, p2=v2])

XML 配置的结果

<subsystem xmlns="urn:jboss:domain:naming:2.0">
    <bindings>
        <object-factory name="java:global/foo/bar/factory" module="org.foo.bar" class="org.foo.bar.ObjectFactory">
            <environment>
                <property name="p1" value="v1" />
                <property name="p2" value="v2" />
            </environment>
        </object-factory>
    </bindings>
  </subsystem>

使用以下命令删除绑定。

/subsystem=naming/binding=java\:global\/foo\/bar\/factory:remove

绑定外部上下文

使用 external-context XML 配置项可以联合外部 JNDI 上下文,如 LDAP 上下文。

  • name 属性是必需的,它为这个条目指定目标 JNDI 名。
  • class 属性是必需的,它指定了用来创建联合上下文(federated context)的 Java 初始命名上下文类型。请注意,这个类型需要有一个带有单一环境映射参数的 constructor。
  • module 参数是可选的,它指定了 JBoss Module ID,外部 JNDI 上下文所需的类可以从这里加载。
  • cache 参数是可选的,默认值是 false。它指定了外部上下文实例是否可以被缓存。
  • environment 子项是可选的,它被用来提供查看外部上下文所需的自定义环境。

以下是一个管理 CLI 命令的示例,它创建了一个外部上下文绑定。

/subsystem=naming/binding=java\:global\/federation\/ldap\/example:add(binding-type=external-context, cache=true, class=javax.naming.directory.InitialDirContext, environment=[java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory, java.naming.provider.url=ldap\:\/\/ldap.example.com\:389, java.naming.security.authentication=simple, java.naming.security.principal=uid\=admin\,ou\=system, java.naming.security.credentials= secret])

XML 配置的结果

<subsystem xmlns="urn:jboss:domain:naming:2.0">
    <bindings>
        <external-context name="java:global/federation/ldap/example" class="javax.naming.directory.InitialDirContext" cache="true">
            <environment>
                <property name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory" />
                <property name="java.naming.provider.url" value="ldap://ldap.example.com:389" />
                <property name="java.naming.security.authentication" value="simple" />
                <property name="java.naming.security.principal" value="uid=admin,ou=system" />
                <property name="java.naming.security.credentials" value="secret" />
            </environment>
        </external-context>
    </bindings>
</subsystem>

使用以下命令删除绑定。

/subsystem=naming/binding=java\:global\/federation\/ldap\/example:remove
注意

当查找的资源是一个没有正确实现 lookup(Name) 方法的 JNDI 厂商时,会出现一个 "javax.naming.InvalidNameException: Only support CompoundName names" 错误。

这个问题的一个临时解决方法是,指定使用 lookup(String) 方法的外部上下文环境,而不添加以下属性。但是,这会导致性能下降。

<property name="org.jboss.as.naming.lookup.by.string" value="true"/>

绑定查找别名

lookup 项允许为存在的项绑定额外的名称或别名。

  • name 属性是必需的,它为这个条目指定目标 JNDI 名。
  • lookup 属性是必需的,它指定了源 JNDI 的名。

以下是把存在的项与一个别名进行绑定的管理 CLI 命令的示例。

/subsystem=naming/binding=java\:global\/new-alias-name:add(binding-type=lookup, lookup=java\:global\/original-name)

XML 配置的结果

<lookup name="java:global/new-alias-name" lookup="java:global/original-name" />

使用以下命令删除绑定。

/subsystem=naming/binding=java\:global\/c:remove

21.3. 配置远程 JNDI 接口

远程 JNDI 接口允许客户端查找远程 JBoss EAP 实例中的项。naming 子系统可以被配置为启用或禁用这个接口(默认是启用)。远程 JNDI 接口使用 <remote-naming> 项进行配置。

使用以下管理 CLI 命令激活或重新激活远程 JNDI 接口。

/subsystem=naming/service=remote-naming:add

使用以下管理 CLI 命令取消激活远程 JNDI 接口。

/subsystem=naming/service=remote-naming:remove
注意

只有 java:jboss/exported 上下文中的项可以通过远程 JNDI 访问。