生命周期EJB容器中的简单Java类/对象

时间:2016-04-01 17:31:38

标签: java java-ee ejb

我们都使用没有任何注释的简单Java类。当我们在普通的独立应用程序中使用它时,我们使用'New'关键字来创建实例并使用它。对象在堆上创建。 如果没有实例化,我仍然可以访问或使用其静态成员。

我的问题是,如果我将这个简单的类部署到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);
    }
}

1 个答案:

答案 0 :(得分:0)

每次调用@Stateless EJB3时,容器从一个先前创建的池中选择一个(如果池为空,则创建一个新池)并使用该实例执行被调用的函数。在你的情况下,每个人都有一个新的" ClientCounter,所以它的"计数器"实例化时将始终为0,在调用之后和容器销毁之前将始终为1。

您可以清楚地识别此行为,将以下内容添加到EJB中:

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

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

显然,你必须添加一个getCount(){return count;在你的ClientCounter上。

如果你真的想进行这种计数,你必须选择另一种解决方案,因为即使你试图使你的count属性保持静态,你也可能会遇到并发问题以及在集群上使用EJB时​​的问题。 p>