ejb 会话bean 的疑惑

gfghgi 2008-04-08 11:46:05
正在看书自学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是否流行呢?
...全文
85 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
myth_2002 2008-04-09
  • 打赏
  • 举报
回复
要想看到激活和挂起的效果,关键就是设置应用服务器里的session bean池的大小(也就是你要去找glassfish的ejb配置文件,将这个池限制成2个)。
至于没有执行挂起的方法,原因也是上述池的大小,我猜glassfish是把所有session bean都放到内存池去了,没有“钝化”到硬盘上。
UnknowREN 2008-04-08
  • 打赏
  • 举报
回复
 /**
* 在挂起Bean实例前,EJB容器会调用它
*/
@PrePassivate
public void passivate(InvocationContext ctx) throws Exception {
System.out.println(this.toString()+"cb:passivate()");
ctx.proceed();
}


你的代码注释不是已经说明这个问题了吗?

我觉得技术没有流行不流行的,万变不离其踪,知道原理了,其他的都一样。个人意见。
gfghgi 2008-04-08
  • 打赏
  • 举报
回复
回楼上,我是在看那本书,,那就是说要配置glassfish了?另外就是,,书上的结果似乎没执行打印挂起和激活,后来我索性new了100个bean ,结果也是差不多 。。
难道这就算观察到了有状态bean的挂起和激活操作了吗。。。
myth_2002 2008-04-08
  • 打赏
  • 举报
回复
楼主是看精通EJB3.0(Mastering EJB3.0)吧,他写这本书不是针对某个应用服务器的。
所以说“设置会话bean实例限制在2个以内”。
因为不同的应用服务器,它的ejb配置文件格式是不一样的。你要参考应用服务器的安装手册

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧