Java 返回我自己的EJB的远程JNDI查找

Java 返回我自己的EJB的远程JNDI查找,java,ejb,jndi,ejb-3.0,jboss-4.2.x,Java,Ejb,Jndi,Ejb 3.0,Jboss 4.2.x,这是我在Stack Overflow的第一个问题,如果我做错了什么,请随时告诉我:) 我正在从事一个涉及EJB和JBoss4.2.3.GA的项目。在某种程度上,我们尝试访问集群的每个节点,定位EJB并返回它 这是执行JNDI查找的一段代码: public static <I> I getCache(Class<I> i, String clusterNode) { ServiceLocator serviceLocator = ServiceLocator.get

这是我在Stack Overflow的第一个问题,如果我做错了什么,请随时告诉我:)

我正在从事一个涉及EJB和JBoss4.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;
}
publicstatici-getCache(类I,字符串clusterNode){
ServiceLocator ServiceLocator=ServiceLocator.getInstance();
字符串jndi=serviceLocator.getRemoteJNDIName(i);
Properties props=新属性();
props.setProperty(Context.PROVIDER_URL,“jnp://”+clusterNode+”:“
+jndiPort);
setProperty(Context.URL_PKG_前缀,“org.jboss.naming”);
props.setProperty(Context.INITIAL\u Context\u工厂,
“org.jnp.interfaces.NamingContextFactory”);
对象结果=空;
试一试{
InitialContext ctx=新的InitialContext(道具);
结果=ctx.lookup(jndi);
}捕获(NamingE例外){
返回null;
}
返回(I)结果;
}
在这里:


  • clusterNode是一个简单的字符串,带有节点的IP地址或dns名称。例如:“192.168.2.65”或“cluster1”
  • getRemoteJNDIName返回如下字符串:“MyEARName/MyEJBName/remote”
问题是,当我用“127.0.0.1”调用这个方法时,它工作得很好。另外,如果我用一个服务器正在运行的现有IP地址调用它,也没关系

但是,如果我使用不存在或不工作的地址或dns名称调用该方法,而不是抛出NamingException,它将在我自己的机器中返回EJB。因此,我不知道节点是否启动

我想可能有更好的办法。我很想听听他们的情况,但是我们不能对产品进行“大”的改变,因为到目前为止,产品已经投入生产几年了

就这样。谢谢你的期待和最好的问候

但是,如果我使用不存在或不工作的 地址或dns名称,而不是引发NamingException,它 返回我自己机器中的EJB

我认为这种行为可以解释,如果你有自动。如果未指定Contex.PROVIDER\u URL或无法访问列表中的节点(这是您的情况),则允许客户端在网络中搜索可用的JNDI服务

但是,这仅在某些条件下有效,其中一些条件是:所有群集节点以所有模式运行,所有节点位于同一子网中

您可以通过InitialContext属性
jnp.disableDiscovery=true
禁用此行为设置

我想可能有更好的办法


根据代码,您没有捕获从JNDI轮询的对象,这意味着每次需要执行服务时,都必须执行新的查找(这是一个耗时的操作)。ServiceLocator模式建议缓存查找结果以提高性能。

您的配置是否有可能回退到localhost?
clusterNode
的值是什么?clusterNode是一个简单的字符串,带有节点的IP地址或dns名称。例如:“192.168.2.75”或“cluster1”。谢谢你的回答。正如你所说,所有节点都处于“全部”模式,所以我想你是对的。我会尽快试一试。关于缓存,实际上我们正在缓存JNDI调用以避免新的查找。只需使用简化代码来澄清问题:)