Application Client通过远程接口访问Glassfish上的EJB。我可以通过本地界面吗?

时间:2011-06-15 17:44:08

标签: java-ee ejb-3.0 java-ee-6

我最近浏览了一篇关于如何创建和在Glassfish上访问EJB部署的企业应用程序客户端的Netbeans文章。(Article Link Here)我对这篇文章有几个问题。

本文通过远程接口公开EJB,我认为这将导致应用程序客户端必须进行远程调用。这样做有很多开销。当本地接口参数通过引用传递时,远程接口参数按值传递,这导致参数被复制 - >这可能相当昂贵。

所以我的问题是为什么在这里使用remote界面?是因为客户端机器和Glassfish可能位于不同的机器(不同的JVM)上。因此,如果我说客户端代码和Glassfish服务器位于同一台机器(相同的JVM)上,我可以以某种方式改变设计以使用本地接口来避免开销。

由于文章中提供了所有代码,我不会在此处再次发布。如果您仍然坚持要我发布代码

,请与我们联系

2 个答案:

答案 0 :(得分:3)

EJB FAQ on the Glassfish site addresses this question,很明显除非你使用嵌入式容器,否则它是不可能的:

  

我有一个带有Local的EJB组件   接口。我可以从一个访问它   应用程序客户端或独立的   java客户端?

     

如果EJB组件在其中运行   服务器,没有。 EJB Local视图是   使用的优化调用路径   call-by-reference语义。它是   仅适用于Web组件和   EJB组件是其中的一部分   与目标EJB相同的应用程序   零件。访问EJB组件   从服务器上运行的   Application Client或独立java   客户端,你需要使用a   远程3.x业务界面,2.x   家庭界面或Web服务。

     

另一种选择,如果使用GlassFish   v3,是使用EJB 3.1 Embeddable   API。这允许Java SE程序   直接在其中执行EJB组件   相同的JVM,不使用服务器   过程

The next question还提示了为什么会出现这种情况 - Java EE规范从未明确指定必须可以在同一JVM /容器中的多个应用程序中访问本地接口。

因此,除了一两种情况外,应用程序服务器供应商从未这样做过。大多数原因最终归结为类加载器 - EJB模块具有自己的类加载器(有时也是应用程序类加载器),如果本地接口必须在多个应用程序之间共享,那么所有这些都必须共享同一个类加载器,或者应用程序服务器必须在父类加载器中加载接口类。

答案 1 :(得分:2)

它使用远程接口,因为应用程序客户端位于与EJB服务器不同的JVM中。两者之间谈话的唯一方法是通过套接字。

您所谈论的内容更类似于嵌入在客户端中的嵌入式EJB服务器。这不是应用客户端模型所支持的。

GFv3可以嵌入,因此可以完成,但它不是Java EE模型或配置文件的描述部分,其中应用程序客户端模型是Java EE规范的一部分。