应用程序EJB注入的应用程序

时间:2012-07-01 11:22:28

标签: java-ee glassfish glassfish-3

我上周与一些Corba编组例外情况纠缠在一起。一个glassfish Web应用程序试图从同一台机器上的另一个Web应用程序获取一些数据,同一个域和相同的EAR。我在StackOverflow中找到了正确的答案。一个对象不是Serializable。解决了这个小问题之后,glassfish服务器真的忙着做s.t.一阵子。我怀疑它是序列化一个非常大的对象。所以我的想法是,只有一个小“指针”从一个应用程序转移到另一个应用程序似乎是错误的。它复制整个结构。

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

谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

你想做什么绝对是可能的。一些术语澄清。

您使用bean的远程接口模块到EJB模块注入

使用bean的本地接口模块到模块EJB注入

对术语进行一些澄清:

应用程序与模块

当两个WAR文件在同一个EAR中时,您的规格条款是一个应用程序和两个模块。

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

重要的是EAR创建了一个将成为父类的类加载器,每个WAR都成为EAR的子类加载器。因此,WAR文件无法看到彼此的类,但是他们可以看到EAR中的共享类。这就是我们的解决方案所在的位置 - 稍后会有更多内容。

Remote vs Local refs

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

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

解决方案

因为你有一个EAR,所以可以将bean(EJB)从war文件中移出并放入一个共享jar中,该jar放在WAR文件旁边的EAR文件的根目录下。您还必须从WAR文件中删除bean类及其接口,以使其正常工作。

然后,您可以将bean的@Remote接口更改为@Local

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

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

如果您还将此EJB暴露给其他应用程序(例如在服务器之外或其他EAR中),那么您仍然可以通过向注释为@Remote的bean添加第二个接口来实现此目的。单个EJB可以轻松地公开@Local@Remote接口(或视图,因为我们在规范中称它们)以及@WebService和REST服务意见。