2012-08-08 179 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)可以回答:-)