2017-07-05 4 views
5

Ich habe eine Klasse, die wie folgt aussieht:Mehrere Instanzen einer @Singleton OpenEJB Bohne vorhanden

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

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

} 

Aus dem ApplicationComposertestng Test genannt wird, die wie folgt aussieht:

@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(); 
    } 
} 

Das Problem Ich beobachte, wenn der Test läuft, ist das object id der Instanz der MySingletonImpl Klasse, die die test() Methode aufgerufen ist nicht die gleiche wie die Instanz, auf der die init() Methode aufgerufen wird.

Das Verhalten scheint seltsam.

Erstens, wie kann mein Problem behoben werden? Ich möchte Methoden für dasselbe Objekt initiieren und dann aufrufen, nicht verschiedene Instanzen derselben Klasse.

Zweitens, warum überhaupt würde der Container mehrere @Singleton s instanziieren?

Antwort

1

Ist Ihre Schnittstelle @Remote oder lokal? Wenn seine @Local Änderung es @Remote:

„EJB-Spezifikation bietet keine Garantie für jedes Verhalten, wenn Sie die lokalen Schnittstellen für Inter-Module Kommunikation verwenden, auch wenn diese Module Teil der gleichen Anwendung sind Server/JVM. "

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

+0

Ich nehme meine Anwendung Zwischenmodulkommunikation nicht verfügen, obwohl ich ein wenig verwirrt, bin, was ein „Modul“ betrachtet. Beim Testen sollte ApplicationComposer ein einzelnes Modul erstellen, wie es in der Modul-Annotation vorgeschlagen wird. Wenn sie ausgeführt wird, wird die Anwendung als einzelner Krieg mit einer web.xml mit mehreren JARs bereitgestellt, jede mit ihrem beans.xml-Deskriptor. Soweit ich das beurteilen kann, wird es als ein "Modul" betrachtet. Ich möchte vermeiden, die Schnittstelle Remote zu machen, Serialisierungs-Deserialisierung Strafe und Komplikationen zu verhindern. Vielen Dank. – alex440

Verwandte Themen