急切请教 如何遍历所有 stateful bean 多谢
我在业务中有个需求,需要对所有在缓存中的用户遍历,根据他们不同的情况发出通知消息。
如果我采用stateful bean,我不知道怎样遍历这些bean,好像容器不提供这些标准方法,除非我hack jboss。
如果我采用stateless bean,我只能自己写一个cache,保存每个客户不同的状态。这个cache内部实现线程同步原语,但是这样会违背ejb的不能在容器内部实现同步原语的限制。
我该怎么办,谢谢各位大虾
我在业务中有个需求,需要对所有在缓存中的用户遍历,根据他们不同的情况发出通知消息。
如果我采用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,那种解决方案好
多谢!!!
写入数据库啊。
这样写:
|
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 时怎么办?