2017-04-25 119 views
0

儘管我早些時候使用過EJB,但我想重新確保自己知道它是如何工作的。因此,我創建了一個簡單會話Bean EJB(3.1),並將其打包爲.ear(也有客戶端jar)。以下是摘錄:使用遠程獨立客戶端調用EJB 3.1會話Bean

會話Bean的實現:

package com.example; 
import javax.ejb.Stateless; 

    @Stateless 
    public class FirstSessionEJB implements FirstSessionEJBRemote { 

    public FirstSessionEJB() { 

    } 

    @Override 
    public String print() { 

     return "Hello"; 
    } 
} 

遠程接口:

package com.example; 

import javax.ejb.Remote; 

@Remote 
public interface FirstSessionEJBRemote { 
    public String print(); 
} 

我部署這個EJB作爲的.ear併成功部署在Wildfly 10.x

現在,我想使用獨立的Java客戶端訪問它,運行在單獨的JVM中。

這裏是客戶端代碼(它可能沒有完成,因爲我不清楚如何調用,主要是由於JNDI)。

package com.example.main; 

import java.util.Hashtable; 

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

import com.example.FirstSessionEJBRemote; 

public class Main { 

    public static void main(String[] args) throws NamingException { 

     String GLOBAL_JNDI_NAME="java:global/FirstEJBProjEAR/FirstEJBProj/FirstSessionEJB!com.example.FirstSessionEJBRemote"; 

     Hashtable<String,String> jndiProperties = new Hashtable<>(); 
     jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 

     InitialContext ic = new InitialContext(jndiProperties); 

     FirstSessionEJBRemote ejbRemote = null; 
     ejbRemote = (FirstSessionEJBRemote)ic.lookup(GLOBAL_JNDI_NAME); 
     ejbRemote.print(); 
    } 
} 

我提到的關於如何做JNDI查找this鏈接(什麼在所有參數使用,但它不工作。)

在鏈接中提到,它有Wildfly具體沒有JNDI查找的jar。

誰能幫助我瞭解:

1)我需要設置爲JNDI所有屬性查找?

2)是否有任何特定的jar需要在客戶端應用程序中存在?

我不想使用任何特定的Wildfly jar,也就是說,我想用傳統的JNDI查找,所以任何人都可以請指導我嗎?

只爲編寫一個簡單的「Hello world」類EJB而掙扎是非常令人沮喪的。我提到一些書很好,但是他們提供的所有內容都只是「查找」代碼,而沒有實際說明需要包含哪些屬性以用於JNDI和任何要包含的jar。

回答

2

由於您鏈接到的文章雖然在文本山中隱藏了一點,但您確實需要在Wildfly服務器安裝(bin/client/jboss-client.jar)中找到的jboss-client.jar。 ;它需要在客戶端的運行時類路徑上。它包含以您的代碼中引用的包org.jboss.ejb.client.naming開頭。

對於客戶端來說,jar包含額外的魔力,以便能夠使用Wildfly服務器設置和維護EJB遠程調用,只是使用JNDI不會削減它。沒有一個jar來統治它們,每個容器(Wildfly,Glassfish,Weblogic等)都有自己的客戶端庫實現。


請注意,從客戶端應用程序調用EJB是非常古老的學校(閱讀:你不想這樣做)。 EJB技術更實際和更現代的一種觀點是在企業容器本身內使用它,比如來自Web應用程序/戰爭 - 稱爲RESTful服務的一部分。您可能甚至不需要EAR文件的額外層,那麼您可以將所有內容整齊地打包到一個war應用程序中。

而在這種情況下,如果您確實有客戶端應用程序,則該客戶端可以與RESTful服務交談 - 這是一個更簡單,跨服務器的跨平臺通信界面。

+0

感謝您的回答,我確實看到了客戶端jar;但我懷疑如果使用那個不需要JNDI的話,那麼這個jar是他們提到的那個?我知道需要一些客戶端jar(它將進行低級別的通信,並且對於不同的應用程序服務器是不同的);然而,鏈接中提到的jar是使用哪個JNDI可能發生的那種「標準」(當然名稱會在不同的AS中有所不同)的那個?此外,在那個例子中,他們使用「ejb」而不是「java」,所以它特定於Wildfly? – CuriousMind

+0

JavaEE標準只規定一個容器必須提供一個遠程接口,它並不指定一個容器實現的標準。就像我提到的那樣,每個接口都有自己的接口,它們位於自己的實現jar中。他們唯一分享的是它建立在JNDI的基礎之上,但對此沒有任何標準化。所以你甚至不能使用Wildfly jar來連接到舊版本的JBoss。 – Gimby