2016-04-01 45 views
0

我們都使用沒有任何註釋的簡單Java類。當我們在普通的獨立應用程序中使用它時,我們使用'New'關鍵字來創建實例並使用它。該對象在堆上創建。 如果它沒有實例化,我仍然可以訪問或使用它的靜態成員。生命週期EJB容器中的簡單Java類/對象

我的問題是,如果我將這個簡單的類部署到EJB容器,那麼它會發生什麼?我沒有註釋它StatelessStatefulEntity,所以容器如何管理它。以下是示例代碼。該POJO這裏(ClientCounter)沒有什麼特別之處,但只是舉例:

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

,並且客戶端:

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文件的組織。他們如何組裝,以及他們如何提供訪問應用程序的哪一部分? – SacJn

+0

我已添加示例代碼 – gero

+0

您正在作出一個不正確的假設。您**不要**將這個簡單的類部署到EJB容器*中。您將應用程序部署到Java EE應用程序服務器(WildFly,TomEE,Glassfish等),並且所有EJB將由您的應用程序服務器內的EJB容器管理。您的POJO作爲您的ClientCounter將由類加載器作爲普通Java程序中的普通Java類進行管理。請看@Will Hartung的[這個答案](http://stackoverflow.com/a/8088403/1346996)。 – aribeiro

回答

0

每次@Stateless EJB3被調用時,容器挑選一個從previosly創建池(或創建一個新池(如果池爲空)並使用此實例執行調用的函數。在你的情況下,每個人都有一個「新」ClientCounter,所以它的「計數器」將在實例化時始終爲0,在調用之後和容器銷燬之前爲1。

你可以清楚地識別這種行爲添加以下到您的EJB:

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

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

很明顯,你必須添加一個getCount將(){返回計數; }在你的ClientCounter上。

如果您確實想要進行這種計數,您必須選擇另一種解決方案,因爲即使您試圖使count屬性爲靜態,您可能會面臨併發問題以及在羣集上使用EJB時​​的問題。