我有两个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
两个问题:
答案 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));
在这种情况下,您可以实施ForeignJNDIObjectRefAddr
和ForeignJNDIObjectFactory
,当需要进行查找时,您的ForeignJNDIObjectFactory.getObjectInstance
方法将会被ForeignJNDIObjectRefAddr
实例调用为它的第一个参数,以便您拥有查找和返回远程对象所需的所有信息。祝你好运!
答案 1 :(得分:0)
这是可能的。如果您可以升级您的EAP版本会更容易。如果您有EAP订阅,我认为没有理由保留旧版本。自那以后修复了很多错误。
外部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