2017-07-05 3 views
5

j'ai une classe qui ressemble à ceci:Plusieurs cas d'un haricot @Singleton OpenEJB présente

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

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

} 

Il est appelé à partir du ApplicationComposertestng test qui ressemble à ceci:

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

Le problème J'observe quand le test s'exécute, est que le object id de l'instance de la classe MySingletonImpl que la méthode test() a appelée n'est pas la même que l'instance sur laquelle la méthode init() est appelée.

Le comportement semble étrange.

D'abord, comment mon problème peut-il être résolu? Je veux init et ensuite appeler des méthodes sur le même objet, pas différentes instances de la même classe. Deuxièmement, pourquoi le conteneur instancié plusieurs @Singleton s?

Répondre

1

Votre interface est-elle @Remote ou locale? Si son changement @Local à @Remote:

« spécification EJB ne garantit pas un comportement lorsque vous utilisez les interfaces d'entreprises locales pour inter-modules communication même si ces modules font partie de la même application Serveur/JVM. "

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

+0

Je suppose que ma demande ne dispose pas de communication inter-module, bien que je suis un peu confus quant à ce considéré comme un "module". Lors du test, ApplicationComposer est supposé créer un seul module, comme le suggère l'annotation du module. Lors de l'exécution, l'application est déployée comme une guerre unique ayant un fichier web.xml, avec plusieurs fichiers jar, chacun avec son descripteur beans.xml. Pour autant que je sache, il est considéré comme un "module". Je voudrais éviter de faire l'interface à distance, pour éviter les pénalités de sérialisation-désérialisation et les complications. Merci. – alex440