1

上周我在一些 Corba Marshalling Exceptions 中苦苦挣扎。一个 glassfish Web 应用程序试图从同一机器、同一域和同一 EAR 上的另一个 Web 应用程序获取一些数据。我在 StackOverflow 中找到了正确的答案。一个对象不可序列化。在解决了这个小问题之后,glassfish 服务器真的忙了一阵子。我怀疑它正在序列化一个非常大的对象。所以我认为只有一点“指针”从一个应用程序转移到另一个应用程序的想法似乎是错误的。它复制了整个结构。

我的问题是现在。“从一个应用程序到另一个应用程序进行 ejb 注入是否聪明?” 我想如果我保持物体很小(“瞬态”等)它会工作得足够快。但是我不能只访问另一个应用程序中的另一个对象来读取一些数据吗?

谢谢你的帮助。

4

1 回答 1

3

你想做的绝对是可能的。一些术语说明。

您所拥有的是使用 bean 的远程接口的模块到模块 EJB 注入。

您想要的是使用bean 的本地接口的模块到模块 EJB 注入。

因此,对术语进行一些澄清:

应用程序与模块

当两个 WAR 文件在同一个 EAR 中时,您在规范方面拥有的是一个应用程序和两个模块。

在所有其他情况下(两个 EAR,WAR 不在一个 EAR 中),您有应用程序到应用程序,这更难处理。

意义在于 EAR 创建了一个类加载器,它将成为父类,每个 WAR 都成为 EAR 的一个子类加载器。因此,WAR 文件无法看到彼此的类,但它们可以看到 EAR 中的共享类。这就是我们的解决方案所在——稍后会详细介绍。

远程与本地参考

远程引用是按值传递的(您会获得数据的副本)本地引用是按引用传递的(您提到的“指针”)

请注意,@EJB在任何一种情况下都使用相同的注释,并且无法判断您可能拥有哪种注释。只有 bean 本身决定通过bean 类或 bean 的接口@Remote公开哪种类型的引用。@Local

解决方案

因为您有一个 EAR,所以可以将 bean(EJB)从 war 文件中移出并移到一个共享 jar 中,该 jar 位于 EAR 文件的根目录中,紧挨着 WAR 文件。您还必须从 WAR 文件中删除 bean 类及其接口才能使其正常工作。

然后你可以@Remote将bean的接口更改为@Local.

如果这样做,您将获得按引用传递的语义,并且两个 WAR 文件可以在没有 CORBA 或类似的重物的情况下共享数据。他们只是传递 java 对象,就像在 java 中传递任何对象一样。

如果您确实确实有应用程序到应用程序的情况,那么您确实需要使用@Remote传递值语义,这当然要慢很多倍。

如果您还将该 EJB 公开给其他应用程序(例如在服务器之外或在其他 EAR 中),那么您仍然可以通过向 bean annotated 添加第二个接口来做到这一点@Remote。单个 EJB 可以很容易地公开@Local接口@Remote(或我们在规范中称之为视图@WebService)以及REST 服务视图。

于 2012-07-01T20:39:13.690 回答