我上周与一些Corba编组例外情况纠缠在一起。一个glassfish Web应用程序试图从同一台机器上的另一个Web应用程序获取一些数据,同一个域和相同的EAR。我在StackOverflow中找到了正确的答案。一个对象不是Serializable。解决了这个小问题之后,glassfish服务器真的忙着做s.t.一阵子。我怀疑它是序列化一个非常大的对象。所以我的想法是,只有一个小“指针”从一个应用程序转移到另一个应用程序似乎是错误的。它复制整个结构。
我的问题是现在。 “从一个应用程序到另一个应用程序进行ejb注入是否聪明?” 我想如果我保持对象小(“瞬态”等),它将足够快。但我不能只访问另一个应用程序中的其他对象来读取一些数据吗?
谢谢你的帮助。
答案 0 :(得分:3)
你想做什么绝对是可能的。一些术语澄清。
您使用bean的远程接口模块到EJB模块注入。
使用bean的本地接口模块到模块EJB注入。
对术语进行一些澄清:
当两个WAR文件在同一个EAR中时,您的规格条款是一个应用程序和两个模块。
在所有其他情况下(两个EAR,不在EAR中的WAR),您有应用程序到应用程序,这很难处理。
重要的是EAR创建了一个将成为父类的类加载器,每个WAR都成为EAR的子类加载器。因此,WAR文件无法看到彼此的类,但是他们可以看到EAR中的共享类。这就是我们的解决方案所在的位置 - 稍后会有更多内容。
远程引用是按值传递(您获得数据的副本) 本地引用是引用传递(“指针”,如你所提到的)
请注意,在任何一种情况下都使用相同的注释@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服务意见。