2013-08-24 43 views
1

我在JBoss 6.0 AS的本地主機上部署了一個應用程序。這個應用程序有一個名爲ExampleEJB的遠程EJB bean。現在我試圖編寫一個消耗ExampleEJB的簡單客戶端應用程序。此客戶端應用程序不會部署在任何應用程序服務器上。這個想法是編寫一個簡單的Java SE客戶端程序。我已經寫了以下嘗試進行查找:關於JBoss AS 6.0的JNDI查詢

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); 

在這一點上,我已經試過兩種方法第一種是執行像在Java EE 6教程examplified直接查找(http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html):

ExampleEJB exampleEJB = (ExampleEJB) ic.lookup("java:global/myApp/ExampleEJB"); 

的第二次嘗試,試圖獲得JNDI上下文環境,然後從這個環境獲得所需的豆:

Context envContext = (Context)ic.lookup("java:/comp/env"); 
envContext.lookup(...) 

的問題是,我receivin g以下例外:分別爲「javax.naming.NameNotFoundException:全局未綁定」和「javax.naming.NameNotFoundException:未綁定」。我無法根據需要執行查找。

有人有線索嗎?

回答

5

如果使用java:global/,那麼JNDI名稱應該是這樣的:

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

java:global/<ear>/<ejb-jar>/<ejb-name> 

其中耳朵是.ear文件的名稱,並EJB -jar EJB .jar文件的名稱。


如果你同時擁有本地和遠程接口,你可以不同使用此方案:

java:global/<ear>/<ejb-jar>/<ejb-name>!<interface> 

其中接口包含了封裝和接口名稱(例如:a.b.c.ExampleEJBRemoteIfc)。


因此,在你的設置:如果myApp.ear包含myEjb.jar其中包含一個EJB的名字是ExampleEJB,那就試試這個JNDI名稱:

java:global/myApp/myEjb/ExampleEJB 

java:global/myApp/myEjb/ExampleEJB!a.b.c.ExampleEJBRemoteIfc 

不管怎麼說,請在JMX控制檯中仔細檢查JNDI名稱:

http://localhost:8080/jmx-console/ 
  1. 點擊服務=關於JNDIView
  2. 操作列表:點擊調用由EJB名

至於那頁按鈕

  • 搜索co mp/env全球What is the relationship between java:comp/env and java:global

  • +0

    你好,鈹。非常感謝您的回答。我在jmx-console上檢查過JNDIView。當我寫這個問題時不知道這個。當我在位置執行查找時:「ExampleEar/ExampleEJBImpl/remote」一切正常。你能否確認JBoss將EJB綁定到沒有「java:global」前綴的位置?你知道爲什麼嗎?我認爲這是Java EE 6規範,因此每個應用程序服務器都將遵循默認的「java:global///」位置。 –

    +1

    該名稱綁定到不同的名稱空間(具有不同的作用域)。這就是爲什麼我用「如果使用java:global ...」開始答案。所以是的,還有其他地點以及不同的計劃。你選擇的名字也適用。 JNDIView在java:namespace中顯示的是什麼?在我的情況下,java:global條目只是JNDI中的一個鏈接,與您使用的條目相關。所以兩者都應該工作。 – Beryllium

    +0

    是的,你說得對。我也可以像你說的那樣在java:namespace上看到我的ExampleEJBImpl。它在Global和Java命名空間上。但是,我無法從我的客戶端應用程序訪問java命名空間。即使我使用JNDIView給我的正確路徑。當我嘗試從不同的JVM進程執行查找時,會出現問題。 Java名稱空間只能從同一個JVM訪問。在我的情況下,我必須使用全局名稱空間來執行查找。是對的嗎?再一次感謝你。 –

    1

    好吧,我解決了我的問題。我發現通過訪問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"); 
    

    ,一切都很好。