ejb 会话bean 的疑惑
正在看书自学ejb 代码如下
拦截器
public class CountCallbacks {
public CountCallbacks() {}
/**
* 在构建Bean实例后,EJB容器会调用它
*/
@PostConstruct
public void construct(InvocationContext ctx) throws Exception {
System.out.println();
System.out.println("cb:construct() ");
ctx.proceed();
}
/**
* 在激活Bean实例后,EJB容器会调用它
*/
@PostActivate
public void activate(InvocationContext ctx) throws Exception {
System.out.println("cb:activate()");
ctx.proceed();
}
/**
* 在挂起Bean实例前,EJB容器会调用它
*/
@PrePassivate
public void passivate(InvocationContext ctx) throws Exception {
System.out.println(this.toString()+"cb:passivate()");
ctx.proceed();
}
/**
* 在销毁Bean实例前,EJB容器会调用它
*/
@PreDestroy
public void destroy(InvocationContext ctx) throws Exception {
System.out.println("cb:destroy()");
ctx.proceed();
}
}
客户端
try
{
/* 引用到初始化上下文 */
Context ctx = new InitialContext(System.getProperties());
/* 持有Count EJB组件实例的数组 */
Count count[] = new Count[noOfClients];
int countVal = 0;
/* 创建数组中的各个成员,* 并调用各自的count()业务方法。*/
System.out.println("Instantiating beans...");
for (int i = 0; i < noOfClients; i++)
{
count[i] = (Count) ctx.lookup(Count.class.getName());
/* 初始化Bean实例中的计数器 */
count[i].setName(name[i]);
count[i].set(countVal);
/* 加1,并打印结果到屏幕上 */
countVal = count[i].count();
System.out.println(countVal);
/* 睡眠 */
Thread.sleep(100);
}
/*
* 为了证实挂起和激活操作是否被EJB容器正确处理,
* 调用了Bean实例的count()方法。
*/
System.out.println("Calling count() on beans...");
for (int i = 0; i < noOfClients; i++)
{
/* 加1,并打印结果到屏幕上 */
countVal = count[i].count();
System.out.println(countVal);
/* 调用remove()方法,让EJB容器销毁当前Bean实例 */
count[i].remove();
/* 睡眠 */
Thread.sleep(50);
}
} catch (Exception e)
{
e.printStackTrace();
}
书上说正确设置好,ejb容器,会话bean实例限制在2个以内,(如何设置呢,我用的是glassfish)
客户端输出结果:
1
2
3
Calling count() on beans...
2
3
4
容器端
cb:construct()
aaaset()
aaacount()
cb:construct()
bbbset()
bbbcount()
cb:construct()
cccset()
ccccount()
aaacount()
aaaremove()
cb:destroy()
bbbcount()
bbbremove()
cb:destroy()
ccccount()
cccremove()
cb:destroy()
疑问:虽然得到了结果,但 容器的挂起和激活操作到底起作用了吗? System.out.println(this.toString()+"cb:passivate()");为什么这段代码没有打印呢
另外,现在ejb是否流行呢?