2012-08-08 140 views
4

当我与标准@Stateless@Remote注解来我JBoss AS中部署一个典型的EJB3豆7.1.1我看到下面的JNDI绑定上服务器控制台输出:JBoss AS中7.1.1 JNDI绑定

22:31:43,209 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor]  
(MSC service thread 1-2) JNDI bindings for session bean named HelloEJB3Bean 
in deployment unit deployment "hello.jar" are as follows: 

    java:global/hello/HelloEJB3Bean!archetypesEjb3.IHelloEJB3 
    java:app/hello/HelloEJB3Bean!archetypesEjb3.IHelloEJB3 
    java:module/HelloEJB3Bean!archetypesEjb3.IHelloEJB3 
    java:jboss/exported/hello/HelloEJB3Bean!archetypesEjb3.IHelloEJB3 
    java:global/hello/HelloEJB3Bean 
    java:app/hello/HelloEJB3Bean 
    java:module/HelloEJB3Bean 

但是,我然后找到并使用JNDI ST(使用改编自the JBoss AS 7.1.1 quickstart tutorials代码)从一个独立的Java类叫豆以下类型的环:

String jndiName = "ejb:" + appName + "/"  + moduleName + "/" + distinctName 
         + "/"  + beanName + "!" + viewClassName 
         + (stateful?"?stateful":""); 

(它不属于上述名称空间/绑定之一)。

  1. 为什么会提供如此多的JNDI绑定,并且如果我使用其中一个或另一个,会产生多大的差别?
  2. 有没有标准的路要走,例如也许使用EJB:/命名空间(因为这就是出现在上面给出的快速入门教程)
  3. 为什么EJB:/结合(因为这显然存在就是我曾经跟我的豆)未报告在JBoss AS 7.1.1输出中?

回答

4

ejb:/是JBoss使用的专有名称空间为远程客户端。

它是在JBoss AS 7.x中引入的,它替代了本地使用相同JNDI名称空间的事实标准远程JNDI方式,但是提供了指定远程服务器位置的初始上下文的属性。

ejb:/存在的原因是双重的。根据JBoss的说法,Java EE规范中没有规定远程JNDI访问的实际方式,因此没有理由遵守它。JBoss AS 7的目标之一是研究不同的做事方式,并且由于其规格漏洞,远程EJB在这里提供了机会。

对于ejb:/名称空间,它远比看起来更容易让远程“驱动程序”拦截远程EJB bean的请求,同时确保只有EJB bean可以被请求,而不是说JMS队列(为此它也不是指定如何远程获取它们)以及最糟糕的数据源。

4

1)这些都在Java EE specification中指定(请看capter EE.5.2.2),但足以说它们是“名称空间”,并且根据“how”和“where from “您访问这些EJB时,您最终将根据每个条目获取它。例如,如果同一个模块(EAR)中的代码请求EJB,它可能会通过java:模块进行路由。差异主要在于呼叫的优化程度,因为“比较”访问所需的“幕后”工作比“全局”要少。

2)EE规范说:

本规范推荐,但不要求,即对企业bean的引用应用程序组件的 环境的ejb子上下文组织(也就是,在java :comp/env/ejb JNDI上下文)。请注意,通过注释声明的企业bean引用默认情况下不会在 任何子上下文中。

3)我没有一个答案,但也许有人在freenode上#jboss(或#的jboss-EJB3)可以回答:-)