急切请教 如何遍历所有 stateful bean 多谢


我在业务中有个需求,需要对所有在缓存中的用户遍历,根据他们不同的情况发出通知消息。

如果我采用stateful bean,我不知道怎样遍历这些bean,好像容器不提供这些标准方法,除非我hack jboss。

如果我采用stateless bean,我只能自己写一个cache,保存每个客户不同的状态。这个cache内部实现线程同步原语,但是这样会违背ejb的不能在容器内部实现同步原语的限制。

我该怎么办,谢谢各位大虾

并不是任何功能都适合在EJB容器内完成,在这种情况下,你完全可以使用servlet来达到目的。

stateful bean的引用不是保存在HttpSession中吗?遍历所有的HttpSession的sessionId,就可以得到当前所有的stateful bean ObjectRef了。

或者,直接遍历HttpSession的sessionId,然后调用一个EJB的MDB发送通知。

这个有点类似获得所有在线人员的实现机理。

我的业务中没有web层,是client直接调用ejb,所以这个sessionid有点勉强
如果不用httpsession,而是自己定制一个adaptor是否可以满足呢,也就是说要做一个客户代理的adaptor,保存所有的stateful bean 引用,同时在bean中保存这个adaptor的回掉,如果bean钝化,可以通知adaptor去除这个引用。


这样是否可行,比之在stateless bean中保存一个全局cache,那种解决方案好

多谢!!!

写入数据库啊。

这样写:


// 在此输入java代码
public void ejbCreate(String userID) {
this.Id = userID;
System.out.println(
"ejb create();");
// 插入数据库,表示此用户onLine.
}
...
public void ejbRemove(String userId) {
System.out.println(
"ejbRemove()");
// 从数据库中删除用户Id, -> OFFLINE
}
.......

public void yourBusinessMethod([] argv){
....
}


只能适用于stateful bean, client端可以控制 bean 的生命周期。
stateless是不可以的, bean 的生命周期由容器管理。

to yung:

如果放在数据库中,会严重影响性能,我要求吞吐量很高的。

to banq;
MDB只是一个结构方案,并没有解决如何保存状态。就算使用MDB一样不能回避状态保存,状态遍历问题。

我查过jboss集群文档,,感觉httpsession 是会被web容器托管,集群内状态同步,但是自己写的POJO类(相当于ejb client)是不能被同步的(因为有ejb容器,web容器,没有POJO容器)。但是我不能使用httpsession,因为性能问题。


原本我打算做两个stateful bean,一个client bean是存储各个客户相关的信息,另一个专门存储所有 client bean的引用。这样可以保证在集群内的状态同步。但是这样做恐怕对性能会有影响。的确,采用两个stateful bean的方案是很不好。

我现在的想法是重写jboss的 LRUStatefulContextCachePolicy,因为jboss本身会周期性遍历在内存中的stateful cache,做钝化和激活。我想在其中加上我自己bean的逻辑,或者自己定义一个interceptor,放在最后一个
container-interceptors之后,加上自己的逻辑。jboss这部分的源码我大约看懂了,但是不是很有把握,遇到什么问题,还要向大家多请教。

to yung:

如果放在数据库中,会严重影响性能,我要求吞吐量很高的。

to banq;
MDB只是一个结构方案,并没有解决如何保存状态。就算使用MDB一样不能回避状态保存,状态遍历问题。

我查过jboss集群文档,,感觉httpsession 是会被web容器托管,集群内状态同步,但是自己写的POJO类(相当于ejb client)是不能被同步的(因为有ejb容器,web容器,没有POJO容器)。但是我不能使用httpsession,因为性能问题。


原本我打算做两个stateful bean,一个client bean是存储各个客户相关的信息,另一个专门存储所有 client bean的引用。这样可以保证在集群内的状态同步。但是这样做恐怕对性能会有影响。的确,采用两个stateful bean的方案是很不好。

我现在的想法是重写jboss的 LRUStatefulContextCachePolicy,因为jboss本身会周期性遍历在内存中的stateful cache,做钝化和激活。我想在其中加上我自己bean的逻辑,或者自己定义一个interceptor,放在最后一个
container-interceptors之后,加上自己的逻辑。jboss这部分的源码我大约看懂了,但是不是很有把握,遇到什么问题,还要向大家多请教。

如果觉得放在数据库中影响性能,可以放在内存Cache中,只要将yung那段代码改写一下。

你要改写Jboss代码,已经使你的程序超出J2EE标准约束的范围了。一旦超出这个游戏范围,你可以天马行空想怎么干就怎么干。呵呵

> 如果觉得放在数据库中影响性能,可以放在内存Cache中,只?> 将yung那段代码改写一下。

又回到这个问题,如果放在内存cache中,也就是一个POJO,这部分状态就不能被集群同步了。 :(( 对吗?

>
> 你要改写Jboss代码,已经使你的程序超出J2EE标准约束的范?> 了。一旦超出这个游戏范围,你可以天马行空想怎么干就怎么
> 伞:呛?>
>
>
>
>

论坛里我回复的语句不是很好,当时情急之下,向你道歉。

我觉得你采取改写Jboss代码是所有方案中最差的一个。如果使用weblogic如何办?

数据库的办法真是一个好办法,可以在集群中共享使用,而且放在数据库中,其实是放在缓存中,因为实体Bean等都是有缓存机制的。

Facade + HashMap is enough

数据库真的很慢吗?ejb也不怎么快的,呵呵。
实在不行,在容器外,写一个singleton类,把用户
信息写入singleton类中保存就可以了,这样是不是
够快?(集群恐怕不可以的)
用集群干吗?你是不是要做游戏站点呀/

to banq:
哪里,客气了,改jboss是狗急跳墙的方案,风险很大。
to yung & xok
如果不用集群,我现有的架构(非j2ee)就足够,现在就是想提高系统的容错性,因为down机一次,我们的损失就是一台服务器。


实在不行就只能用2个stateful bean 的方案了。
小弟还有一个折中的方案,使用集群的sigleton ,所以不用状态复制,可以使用stateless session bean ,中使用一个全局的hashmap(这样可以吗????),保存stateful session bean 的所有引用。
这样可以达到集群的目的。

大家看看是否可行。

行吗?
activity 和 passive 时怎么办?