【问题标题】:Several instances of a @Singleton OpenEJB bean present存在多个 @Singleton OpenEJB bean 实例
【发布时间】:2017-07-05 13:28:17
【问题描述】:

我有一个如下所示的课程:

@Singleton
public class MySingletonImpl implements MySingleton{
    @Override
    public void init(){
        ...
    }

    @Override
    public void test(){
        ...
    }

}

它是从ApplicationComposer testng 测试中调用的,如下所示:

@Listeners(ApplicationComposerListener.class)
public class MyTest{
     @EJB
     MySingleton mySingleton;

     @Module
     @Classes(cdi=true, value={MySingletonImpl.class})
     public EjbModule ejbModule() throws Exception{
          return new EjbModule(new EjbJar());
     }

     @BeforeClass
     public void setup(){
          mySingleton.init();
     }

     @Test
     public void test(){
          mySigleton.test();
     }
}

我在测试运行时观察到的问题是,MySingletonImpl 方法调用的MySingletonImpl 类的实例的object id 与调用init() 方法的实例不同.

这种行为看起来很奇怪。

首先,如何解决我的问题?我想在同一个对象上初始化然后调用方法,而不是同一个类的不同实例。

其次,为什么容器会实例化多个@Singletons?

【问题讨论】:

    标签: java singleton testng openejb


    【解决方案1】:

    你的界面是@Remote 还是本地的?如果将其@Local 更改为@Remote:

    "EJB 规范不保证任何行为在 您将本地业务接口用于模块间 即使这些模块是通信的一部分 相同的应用服务器/JVM。”

    https://coderanch.com/mobile/t/608212/java/instances-Singleton-EJB

    【讨论】:

    • 我想我的应用程序不具备模块间通信功能,尽管我对什么被认为是“模块”有点困惑。在测试时,ApplicationComposer 应该创建一个模块,正如 Module 注释所建议的那样。运行时,应用程序部署为一个单一的战争,有一个 web.xml,有几个罐子,每个罐子都有它的 beans.xml 描述符。据我所知,它被认为是一个“模块”。我想避免使用远程接口,以防止序列化-反序列化惩罚和并发症。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2015-01-25
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多