Jakarta ee JBoss AS 6.0上的JNDI查找

Jakarta ee JBoss AS 6.0上的JNDI查找,jakarta-ee,jndi,jboss6.x,Jakarta Ee,Jndi,Jboss6.x,我在JBoss 6.0上的localhost上部署了一个应用程序。此应用程序有一个名为Examplejb的远程EJB bean。现在我尝试编写一个使用Examplejb的简单客户端应用程序。此客户端应用程序将不会部署在任何应用程序服务器上。其思想是编写一个简单的JavaSE客户端程序。为了执行查找,我编写了以下代码: Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interf

我在JBoss 6.0上的localhost上部署了一个应用程序。此应用程序有一个名为Examplejb的远程EJB bean。现在我尝试编写一个使用Examplejb的简单客户端应用程序。此客户端应用程序将不会部署在任何应用程序服务器上。其思想是编写一个简单的JavaSE客户端程序。为了执行查找,我编写了以下代码:

Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL,"localhost:1099");
env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");

InitialContext ic = new InitialContext(env);
此时,我尝试了两种方法,第一种是执行直接查找,如JavaEE6教程()中的示例:

第二次尝试是尝试获取JNDI上下文环境,然后从该环境获取所需的bean:

Context envContext  = (Context)ic.lookup("java:/comp/env");
envContext.lookup(...)
问题是我收到了以下异常:“javax.naming.NameNotFoundException:global not bound”和“javax.naming.NameNotFoundException:comp not bound”。我无法按要求执行查找


有人有线索吗?

好的,我的问题解决了。我发现,通过访问JBoss JMX管理控制台(默认位置为localhost:8080/JMX Console/),可以可视化JBoss上的JNDI树。查找JNDIView服务并调用列表方法。通过可视化JNDI树,我发现我在寻找错误的位置。JBoss在以下位置注册了我的EJB:

+- ExampleEar (class: org.jnp.interfaces.NamingContext)
  |   +- ExampleEJBImpl (class: org.jnp.interfaces.NamingContext)
  |   |   +- remote-br.exemplo.ejb.ExampleEJB (class: Proxy for: br.example.ejb.ExampleEJB)
  |   |   +- remote (class: Proxy for: br.example.ejb.ExampleEJB)
我刚刚修改了代码以在以下位置执行查找:

ExampleEJB exampleEJB = (ExampleEJB) ic.lookup("ExampleEar/ExampleEJBImpl/remote");

一切都很顺利。

好的,我已经解决了我的问题。我发现,通过访问JBoss JMX管理控制台(默认位置为localhost:8080/JMX Console/),可以可视化JBoss上的JNDI树。查找JNDIView服务并调用列表方法。通过可视化JNDI树,我发现我在寻找错误的位置。JBoss在以下位置注册了我的EJB:

+- ExampleEar (class: org.jnp.interfaces.NamingContext)
  |   +- ExampleEJBImpl (class: org.jnp.interfaces.NamingContext)
  |   |   +- remote-br.exemplo.ejb.ExampleEJB (class: Proxy for: br.example.ejb.ExampleEJB)
  |   |   +- remote (class: Proxy for: br.example.ejb.ExampleEJB)
我刚刚修改了代码以在以下位置执行查找:

ExampleEJB exampleEJB = (ExampleEJB) ic.lookup("ExampleEar/ExampleEJBImpl/remote");

一切都很顺利。

如果您使用的是
java:global/
,那么JNDI名称应该如下所示:

java:global/<application>/<module>/<component>


无论如何,请在JMX控制台中仔细检查JNDI名称:

http://localhost:8080/jmx-console/
  • 单击Service=JNDIView
  • 操作列表:点击调用按钮
  • 按EJB名称在该页面中搜索


  • 至于comp/env与global:

    如果您使用的是
    java:global/
    ,那么JNDI名称应该如下所示:

    java:global/<application>/<module>/<component>
    


    无论如何,请在JMX控制台中仔细检查JNDI名称:

    http://localhost:8080/jmx-console/
    
  • 单击Service=JNDIView
  • 操作列表:点击调用按钮
  • 按EJB名称在该页面中搜索


  • 至于comp/env vs.global:

    你好,铍。非常感谢你的回答。我已经在jmx控制台上检查了JNDIView。我写问题的时候不知道。当我在“ExampleEar/ExampleEJBImpl/remote”位置执行查找时,一切正常。您能否确认JBoss将EJB绑定到没有“java:global”前缀的位置?你知道为什么吗?我认为这是JavaEE6规范,因此每个应用服务器都会尊重默认的“Java:global//”位置。这就是为什么我以“如果您正在使用java:global…”开始回答。因此,是的,还有其他地方也有不同的方案。您选择的名称也适用。JNDIView在java:namespace中显示了什么?在我的例子中,java:global条目只是JNDI中与您使用的条目的链接。所以两者都应该起作用。是的,你是对的。我还可以看到java:namespace上的示例ejbimpl,如您所说。它位于全局和Java命名空间上。但是,我无法从客户端应用程序访问java名称空间。即使我使用JNDIView给我的正确路径。当我试图从另一个JVM进程执行查找时,很可能会出现问题。Java命名空间只能从同一JVM访问。在我的例子中,我必须使用全局名称空间来执行查找。是这样吗?再次感谢你,你好,铍。非常感谢你的回答。我已经在jmx控制台上检查了JNDIView。我写问题的时候不知道。当我在“ExampleEar/ExampleEJBImpl/remote”位置执行查找时,一切正常。您能否确认JBoss将EJB绑定到没有“java:global”前缀的位置?你知道为什么吗?我认为这是JavaEE6规范,因此每个应用服务器都会尊重默认的“Java:global//”位置。这就是为什么我以“如果您正在使用java:global…”开始回答。因此,是的,还有其他地方也有不同的方案。您选择的名称也适用。JNDIView在java:namespace中显示了什么?在我的例子中,java:global条目只是JNDI中与您使用的条目的链接。所以两者都应该起作用。是的,你是对的。我还可以看到java:namespace上的示例ejbimpl,如您所说。它位于全局和Java命名空间上。但是,我无法从客户端应用程序访问java名称空间。即使我使用JNDIView给我的正确路径。当我试图从另一个JVM进程执行查找时,很可能会出现问题。Java命名空间只能从同一JVM访问。在我的例子中,我必须使用全局名称空间来执行查找。是这样吗?再次感谢你。
    http://localhost:8080/jmx-console/