这是我在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;
}
下面:
问题在于,当我使用例如“127.0.0.1”调用此方法时,它可以正常工作。此外,如果我用一个服务器启动并运行的现有和工作IP地址来调用它,它也可以。
但是,如果我使用不存在或不工作的地址或dns名称调用该方法,而不是抛出NamingException,它将在我自己的机器中返回EJB。因此,我不知道节点是否正常运行。
我想可能有更好的方法来做到这一点。我想听听他们的意见,但我们不能对产品做出“大的”改动,因为它现在已经生产了几年。
就是这样。感谢您的期待和最好的问候。
答案 0 :(得分:1)
但是,如果我使用不存在或不工作的方法调用该方法 地址或DNS名称,而不是抛出NamingException 在我自己的机器中返回EJB
我认为如果你有自动naming discovery,可以解释这种行为。如果未指定Contex.PROVIDER_URL或列表中的节点无法访问(这是您的情况),则允许客户端在网络中搜索可用的JNDI服务。
然而,这仅适用于某些条件,其中一些:所有群集节点在ALL模式下运行,所有节点都位于同一子网中。
您可以通过设置InitialContext属性jnp.disableDiscovery=true
来禁用此行为。
我想可能有更好的方法来做到这一点
根据代码,您没有捕获从JNDI轮询的对象,这意味着每次需要执行服务时,都必须执行新的查找(这是一项耗时的操作)。 ServiceLocator模式建议缓存查找结果以提高性能。