配置JBoss JNDI绑定到不同服务器上的JNDI?

时间:2014-02-11 10:19:47

标签: jboss jms jboss7.x jndi

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

现在我希望JbossA上的应用程序能够使用自己的JNDI访问jms / Server。另外,我希望JbossB上的应用程序使用jndi-name jms / Client1使用自己的JNDI来访问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)中进行配置?

3 个答案:

答案 0 :(得分:0)

首先,我想不出你想要查找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实例调用为它的第一个参数,以便您拥有查找和返回远程对象所需的所有信息。祝你好运!

答案 1 :(得分:0)

这是可能的。如果您可以升级您的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

答案 2 :(得分:0)

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

Shishir