应用程序客户端通过远程接口访问Glassfish上的EJB我可以通过本地界面进行操作吗?

问题描述

| 我最近浏览了一篇Netbeans文章内容涉及如何创建和访问在Glassfish上部署EJB的企业应用程序客户端。(有关本文的文章链接)我对本文有一些疑问。 本文通过远程接口公开了EJB,我认为这将导致应用程序客户端必须进行远程调用。这样做有开销。通过引用传递本地接口参数时,通过值传递远程接口参数,这导致参数被复制->这可能会非常昂贵。 所以我的问题是为什么在这里使用“ 0”接口?是因为客户端计算机和Glassfish可能位于不同的计算机上(不同的JVM)。因此,如果我说客户端代码和Glassfish服务器在同一台机器(相同的JVM)上,那么我可以以某种方式更改设计以使用本地接口来避免开销。 由于文章中提供了所有代码,因此我不会在此处再次发布。如果您仍然坚持要我发布代码,请告诉我     

解决方法

        Glassfish网站上的EJB常见问题解答解决了这个问题,并且很显然,除非您使用嵌入式容器,否则这是不可能的:   我有一个带有本地的EJB组件   接口。我可以从   应用程序客户端或独立客户端   Java客户端?      如果EJB组件正在其中运行   服务器,不。 EJB Local视图是   使用以下内容的优化调用路径   按引用调用语义。它是   仅适用于Web组件和   EJB组件的一部分   与目标EJB相同的应用程序   零件。访问EJB组件   从服务器上运行的   应用程序客户端或独立Java   客户,您需要使用   远程3.x业务界面,一个2.x   家庭界面或Web服务。      一种替代方法(如果使用GlassFish)   v3,就是使用EJB 3.1 Embeddable   API。这允许Java SE程序   在其中直接执行EJB组件   相同的JVM,无需使用服务器   处理。 下一个问题也提示了为什么这是原因-Java EE规范从未明确指定必须在同一JVM /容器中的多个应用程序之间访问本地接口。 因此,除了一种或两种情况外,应用服务器供应商从未这样做。最终导致归结于类加载器的大多数原因-EJB模块具有它自己的类加载器(有时也是应用程序类加载器),并且如果必须在多个应用程序之间共享本地接口,则它们必须共享相同的类加载器,否则应用程序服务器必须在父类加载器中加载接口类。     ,        它使用远程接口,因为应用程序客户端位于与EJB服务器不同的JVM中。两者之间进行通讯的唯一方法是通过套接字。 您正在谈论的是类似于嵌入式EJB服务器的东西,它是嵌入在客户端中的。那不是应用程序客户端模型所支持的。 GFv3可以嵌入,因此可以完成,但是它不是Java EE模型或配置文件的描述部分,而应用程序客户端模型是Java EE规范的一部分。