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



这是我在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。因此,我不知道节点是否启动。

我想可能有更好的方法可以做到这一点。我想听听他们,但我们不能对产品进行"大"更改,因为它现在已经生产了几年。

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

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

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

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

您可以禁用此行为设置初始上下文属性jnp.disableDiscovery=true

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

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

最新更新