2017-04-25 122 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