我最近浏览了一篇关于如何创建和在Glassfish上访问EJB部署的企业应用程序客户端的Netbeans文章。(Article Link Here)我对这篇文章有几个问题。
本文通过远程接口公开EJB,我认为这将导致应用程序客户端必须进行远程调用。这样做有很多开销。当本地接口参数通过引用传递时,远程接口参数按值传递,这导致参数被复制 - >这可能相当昂贵。
所以我的问题是为什么在这里使用remote
界面?是因为客户端机器和Glassfish可能位于不同的机器(不同的JVM)上。因此,如果我说客户端代码和Glassfish服务器位于同一台机器(相同的JVM)上,我可以以某种方式改变设计以使用本地接口来避免开销。
由于文章中提供了所有代码,我不会在此处再次发布。如果您仍然坚持要我发布代码
,请与我们联系答案 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规范的一部分。