我们都使用没有任何注释的简单Java类。当我们在普通的独立应用程序中使用它时,我们使用'New'关键字来创建实例并使用它。对象在堆上创建。 如果没有实例化,我仍然可以访问或使用其静态成员。
我的问题是,如果我将这个简单的类部署到EJB容器中,那会发生什么呢?我没有注释它Stateless
或Stateful
或Entity
,所以容器如何管理它。以下是示例代码。这里的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 :(得分: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>