尽管我早些时候使用过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