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

时间:2013-09-20 08:32:59

标签: java ejb jndi ejb-3.0 jboss-4.2.x

这是我在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地址或节点名称的简单字符串。例如:“192.168.2.65”或“cluster1”。
  • getRemoteJNDIName返回一个String,例如:“MyEARName / MyEJBName / remote”

问题在于,当我使用例如“127.0.0.1”调用此方法时,它可以正常工作。此外,如果我用一个服务器启动并运行的现有和工作IP地址来调用它,它也可以。

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

我想可能有更好的方法来做到这一点。我想听听他们的意见,但我们不能对产品做出“大的”改动,因为它现在已经生产了几年。

就是这样。感谢您的期待和最好的问候。

1 个答案:

答案 0 :(得分:1)

  

但是,如果我使用不存在或不工作的方法调用该方法   地址或DNS名称,而不是抛出NamingException   在我自己的机器中返回EJB

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

然而,这仅适用于某些条件,其中一些:所有群集节点在ALL模式下运行,所有节点都位于同一子网中。

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

  

我想可能有更好的方法来做到这一点

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

相关问题