这是我在 Stack Overflow 上的第一个问题,如果我做错了什么,请随时告诉我 :)
我正在从事一个涉及 EJB 和 JBoss 4.2.3.GA 的项目。在某一点上,我们尝试访问集群的每个节点,定位一个 EJB 并返回它。
这是执行 JNDI 查找的代码:
public static <I> I getCache(Class<I> i, String clusterNode) {
ServiceLocator serviceLocator = ServiceLocator.getInstance();
String jndi = serviceLocator.getRemoteJNDIName(i);
Properties props = new Properties();
props.setProperty(Context.PROVIDER_URL, "jnp://" + clusterNode + ":"
+ jndiPort);
props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming");
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
Object result = null;
try {
InitialContext ctx = new InitialContext(props);
result = ctx.lookup(jndi);
} catch (NamingException e) {
return null;
}
return (I) result;
}
这里:
- clusterNode 是一个简单的字符串,带有节点的 IP 地址或 dns 名称。例如:“192.168.2.65”或“cluster1”。
- getRemoteJNDIName 返回一个字符串,例如:“MyEARName/MyEJBName/remote”
问题是,当我使用例如“127.0.0.1”调用此方法时,它工作正常。此外,如果我使用服务器已启动并正在运行的现有 IP 地址调用它,也可以。
但是,如果我使用不存在或非工作地址或 dns 名称调用该方法,而不是抛出 NamingException,它会在我自己的机器中返回 EJB。因此,我不知道节点是否启动。
我想可能有更好的方法来做到这一点。我想听听他们的消息,但我们无法对产品进行“大”更改,因为它现在已经投入生产几年了。
而已。谢谢你的期待和最好的问候。