2016-04-01 10 views
0

Wir alle verwenden einfache Java-Klassen ohne Anmerkungen. Wenn wir es in einer normalen eigenständigen Anwendung verwenden, verwenden wir das Schlüsselwort "New", um eine Instanz zu erstellen und zu verwenden. Das Objekt wird auf dem Heap erstellt. Wenn es nicht instanziiert ist, kann ich immer noch auf seine statischen Mitglieder zugreifen oder sie verwenden.Lebenszyklus Einfache Java-Klasse/Objekt im EJB-Container

Meine Frage ist, wenn ich diese einfache Klasse in EJB-Container bereitstellen, was passiert dann? Ich habe es nicht notiert Stateless oder Stateful oder Entity, so wie Container es verwaltet. Unten ist ein Beispielcode. Die POJO hier (ClientCounter) tut nichts Besonderes, aber nur zum Beispiel:

@Stateless 
public class WelcomeBean implements WelcomeBeanRemote { 
    private ClientCounter pojo = new ClientCounter(); 

    @Override 
    public void showMessage() { 
     System.out.println("welcome client"); 
     pojo.increment(); 
    } 
} 

class ClientCounter { 
    private int count; 

    public void increment() { 
     count++; 
    } 
} 

Und der Kunde ist:

public class Client { 

    public static void main(String []args) { 
     Properties jndiProps = new Properties(); 
     jndiProps.put(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.naming.remote.client.InitialContextFactory"); 
     jndiProps.put(Context.PROVIDER_URL,"http-remoting://localhost:8080"); 
     jndiProps.put("jboss.naming.client.ejb.context", true); 
     jndiProps.put(Context.SECURITY_PRINCIPAL, "admin"); 
     jndiProps.put(Context.SECURITY_CREDENTIALS, "admin"); 

     final String appName = ""; 
     final String moduleName = "EJBProject02"; 
     final String sessionBeanName = "WelcomeBean"; 
     final String viewClassName = WelcomeBeanRemote.class.getName(); 

     Context ctx = new InitialContext(jndiProps); 
     WelcomeBeanRemote bean =(WelcomeBeanRemote) ctx.lookup(appName+"/"+moduleName+"/"+sessionBeanName+"!"+viewClassName); 
     bean.showMessage();   
     System.exit(0); 
    } 
} 
+0

Sie sollten Organisation von Pojo-Dateien in einem Ohr beziehen. Wie sind sie zusammengestellt und wie gewähren sie Zugang zu welchem ​​Teil der Anwendung? – SacJn

+0

Ich habe Beispielcode hinzugefügt – gero

+0

Sie machen eine Annahme, die nicht korrekt ist. Sie ** stellen diese einfache Klasse nicht in den EJB-Container *. Sie stellen Ihre Anwendung auf einem Java EE-Anwendungsserver bereit (WildFly, TomEE, Glassfish usw.), und alle Ihre EJBs werden von Ihrem EJB-Container verwaltet, der sich auf Ihrem Anwendungsserver befindet. Ihre POJOs, als Ihr 'ClientCounter', werden vom Klassenlader als normale Java-Klasse in einem normalen Java-Programm verwaltet. Werfen Sie einen Blick auf [diese Antwort] (http://stackoverflow.com/a/8088403/1346996) von @Will Hartung. – aribeiro

Antwort

0

Jedes Mal, wenn ein @Stateless EJB3 genannt wird, der Behälter nimmt man von einem previosly erstellt Pool (oder erstellt einen neuen, wenn der Pool leer ist) und verwendet diese Instanz zum Ausführen der aufgerufenen Funktion. In Ihrem Fall hat jeder einen "neuen" ClientCounter, so dass sein "Zähler" immer 0 ist, wenn er instanziiert wird, und 1 unmittelbar nach dem Aufruf und bevor der Container ihn zerstört.

können Sie identifizieren eindeutig das Verhalten der folgenden auf Ihre EJB hinzu:

@PostConstruct 
public void init() { 
    System.out.println(counter.getCount()); 
} 

@PreDestroy 
public void destroy() { 
    System.out.println(counter.getCount()); 
} 

Offensichtlich haben Sie einen getCount add() {return zählen; } auf Ihrem ClientCounter.

Wenn Sie diese Art des Zählens wirklich durchführen möchten, müssen Sie eine andere Lösung auswählen, da selbst wenn Sie versuchen, die count -Eigenschaft statisch zu machen, Probleme bei der Parallelität und bei Verwendung Ihres EJB auf einem Cluster auftreten.

Verwandte Themen