儘管我早些時候使用過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。
感謝您的回答,我確實看到了客戶端jar;但我懷疑如果使用那個不需要JNDI的話,那麼這個jar是他們提到的那個?我知道需要一些客戶端jar(它將進行低級別的通信,並且對於不同的應用程序服務器是不同的);然而,鏈接中提到的jar是使用哪個JNDI可能發生的那種「標準」(當然名稱會在不同的AS中有所不同)的那個?此外,在那個例子中,他們使用「ejb」而不是「java」,所以它特定於Wildfly? – CuriousMind
JavaEE標準只規定一個容器必須提供一個遠程接口,它並不指定一個容器實現的標準。就像我提到的那樣,每個接口都有自己的接口,它們位於自己的實現jar中。他們唯一分享的是它建立在JNDI的基礎之上,但對此沒有任何標準化。所以你甚至不能使用Wildfly jar來連接到舊版本的JBoss。 – Gimby