Glassfish 2.1 EJB 3.0将本地EJB暴露给在同一域/ jvm中运行的其他应用程序

guy*_*umu 7 ejb-3.0 glassfish-2.x

我有一个现有的项目,我需要配置不同的.这需要在不重大代码更改的情况下发生.我实际上希望我只能通过配置以某种方式做到这一点.过去2到3天我一直在阅读有关此问题的所有内容.我理解glassfish类加载器,以及我可以使用的内容.

我有一个当前的示例项目,它有一个定义@Local接口的EJB.ejb作为ejb模块部署在ejb模块内部,进入glassfish域.现在,我正在尝试为另一个应用程序找到一种方法,该应用程序作为一个耳朵部署到同一个域中,以便能够通过它的本地接口访问该EJB.

我已阅读文档说这是不可能的.然后我在StackOverflow看到了这里的帖子,网上的其他人说这是可能的.但是,我找不到实际的解决方案.

通过调查,我意识到@Local EJB没有将自己注册到jndi(至少根据日志),如果我使用glassfish JNDI浏览器,我也看不到它可见.因此,对我来说,无论是不可能,还是EJB项目的部署是错误的,我都需要公开它.

@Remote是一种可能性,如果它可以通过引用,并没有性能开销.但是允许@Local EJB访问的首选方法确实是最终的需求.

有谁知道我需要做什么才能将@Local EJB暴露给另一个应用程序?或者这显然不可能吗?

我正在使用Glassfish 2.1 With EJB 3.0

如果Glassfish 2.1可以处理EJB 3.1,如果它提供了这种能力,我愿意转向它,但我怀疑它是那么容易.

请协助.谢谢.

我正在加入一笔赏金.要完成赏金,需要在同一个域中运行2个ear应用程序,其中A.ear包含一个@Local EJB,该应用程序也在B.ear中使用.

MeT*_*TeO 5

链接@Peter几乎解决了你的问题.(链接)

解决@ Xavier问题需要解决的一个技巧是为同一版本的双耳提供common.jar(由同一个类加载器加载).如果这样做,则不会抛出类强制转换异常,并且您将能够将ejb与本地接口一起使用.

要做到这一点,你需要将common.jar放入glassfish/domains/domain1/lib文件夹(用你的域名替换domain1).这样,这个jar将由Glassfish的共享类加载器加载.

我使用Eclipse和Glassfish 3进行了快速测试,结构如下:

package com.example;

JarShared
 - @Local class Server

EarServer
 - EjbServer
    - @Stateless class ServerBean implements Server

EarClient
 - EjbClient
    - @Stateless @LocalBean class ClientBean
Run Code Online (Sandbox Code Playgroud)

从ClientBean查询:

InitialContext ic = new InitialContext();
Server server = (Server) ic.
    lookup("java:global/EarServer/EjbServer/ServerBean!com.example.Server");
Run Code Online (Sandbox Code Playgroud)

我没有得到ClassCastException,我可以从ServerBean调用sample方法.

重要笔记:

  • EarServer和EarClient都不应该在lib文件夹中包含JarShared,它们应该重用域lib文件夹中的那个
  • 记得在添加JarShared之后重启Glassfish.
  • 要使两个ejb项目都编译,你必须将JarShared添加到它们的构建路径中,但仅此而已

如果您有任何疑问,请发表评论.