2016-04-01 12 views
0

Hepimiz herhangi bir ek açıklama yapmadan basit Java sınıfları kullanıyoruz. Normal bağımsız uygulamada kullandığımızda, örnek oluşturmak ve kullanmak için 'Yeni' anahtar sözcüğünü kullanırız. Nesne yığın üzerinde oluşturulur. Yapılandırılmadıysa, statik üyelerine hala erişebilir veya kullanabilirim.Yaşam döngüsü Basit Java Sınıfı/Nesne EJB kapsayıcısında

Sorum şu, eğer bu basit sınıfı EJB kapsayıcısına dağıtırsam, o zaman ne olur? Stateless veya Stateful veya Entity no'lu notları açıklamamış olursak, konteyner bunu nasıl yönetir? Aşağıda örnek kod bulunmaktadır. POJO burada (ClientCounter) özel bir şey yapar ama sadece örnek içindir:

@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++; 
    } 
} 

Ve istemcisidir:

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

Pojo dosyalarının kuruluşuna bir kulağa başvurmalısınız. Nasıl bir araya getirilir ve uygulamanın hangi bölümüne erişim sağlarız? – SacJn

+0

Örnek kod ekledim – gero

+0

Doğru olmayan bir varsayım yapıyorsunuz. Siz ** bu basit sınıfı EJB konteynerine * aktarmayın *. Uygulamanızı bir Java EE uygulama sunucusuna (WildFly, TomEE, Glassfish, vb.) Dağıtın ve tüm EJB'leriniz uygulama sunucunuzdaki EJB konteyneriniz tarafından yönetilecektir. POJO'larınız, ClientCounter'ınız olarak, normal bir Java programında normal bir Java sınıfı olarak classloader tarafından yönetilecektir. @Will Hartung tarafından [bu cevap] 'a (http://stackoverflow.com/a/8088403/1346996) bir göz atın. – aribeiro

cevap

0

bir @Stateless EJB3 her çağrıldığında, kap previosly birini seçer oluşturulan havuz (veya havuz boşsa yeni bir tane oluşturur) ve çağrılan işlevi yürütmek için bu örneği kullanır. Durumunuzda, her birinin "yeni" bir ClientCounter'ı vardır, bu yüzden "sayaç" ifadesi her zaman, örneklendiğinde ve 1 aramadan hemen sonra ve kapsayıcıyı imha etmeden önce her zaman 0 olacaktır.

Sen EJB için aşağıdaki ekleyerek bu davranış açıkça tanımlayabilirsiniz: Açıkçası

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

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

, bir GetCount() {eklemek zorunda dönüş saymak; } ClientCounter üzerinde.

Bu tür bir sayımı gerçekten yapmak istiyorsanız, başka bir çözüm seçmeniz gerekir; çünkü, count mülkünüzün statik olmasını sağlasanız bile, eşzamanlılık ve EJB'nizi bir kümede kullanırken sorunlarla karşılaşabilirsiniz.

İlgili konular