问题描述
|
我最近浏览了一篇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规范的一部分。