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

标签 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 地址或 dns 名称。例如:“192.168.2.65”或“cluster1”。
  • getRemoteJNDIName 返回一个字符串,如下所示:“MyEARName/MyEJBName/remote”

问题是,当我使用“127.0.0.1”等调用此方法时,它工作正常。另外,如果我使用服务器已启动并运行的现有且工作的 IP 地址来调用它,也可以。

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

我想可能有更好的方法来做到这一点。我很想听听有关它们的信息,但我们无法对产品进行“大”更改,因为它已经生产了几年了。

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

最佳答案

However if I call the method with a non-existing or non-working address or dns name, instead of throwing the NamingException, it returns the EJB in my own machine

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

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

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

I guess there may be better ways to do it

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

关于java - 远程 JNDI 查找返回我自己的 EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18912181/

相关文章:

java - Wildfly 添加 ManagedExecutorService

java - 在没有 BeanNameAware 接口(interface)的情况下将 bean id 记录到 log4j 日志文件中

java - 在嵌套 JPanel 上绘制组件 (Java)

java - 对象的创建——工厂方法

java - 如何在java中基于数据库中的字段创建表单?

jsf - javax.naming.NameNotFoundException : Name [attribute name] is not bound in this Context. 无法找到 [类名]

java - EJB无状态bean只能返回值,不能打印

java - 在我的计算机上安装虚拟 LDAP 服务器 (Windows 2010)

java - 尝试将 TomEE 1.7.2 与嵌入式 Tomcat 集成时,ejb-example 无法正常工作

java.lang.AbstractMethodError : I get this exception when I am trying to initiate an outbound voice call using nexmo(vonage) API