JiveJdon Community Forums
在线210人   首页   主题总表   培训咨询   精华   查搜   注册    登陆
首页 » 论坛 » J2EE/JavaEE/JEE/EJB/JSF等技术讨论
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
Go 总共有 14 回复 / 1
 发表新帖子   回复该主题贴
noxel

悄悄话
发表文章: 25
注册时间: 2003年09月16日 11:18
急切请教 如何遍历所有 stateful bean 多谢 2003年09月16日 11:31 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表

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

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

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

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

无道

悄悄话
发表文章: 34
注册时间: 2003年08月30日 23:01
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月16日 13:22 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
并不是任何功能都适合在EJB容器内完成,在这种情况下,你完全可以使用servlet来达到目的。
banq

悄悄话
发表文章: 9312
注册时间: 2002年08月03日 17:08
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月16日 13:31 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
stateful bean的引用不是保存在HttpSession中吗?遍历所有的HttpSession的sessionId,就可以得到当前所有的stateful bean ObjectRef了。

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

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

悄悄话
发表文章: 25
注册时间: 2003年09月16日 11:18
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月16日 13:44 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题


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


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

多谢!!!
anonymous

悄悄话
发表文章: 0
注册时间:
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月16日 21:12 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
写入数据库啊。
anonymous

悄悄话
发表文章: 0
注册时间:
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月17日 07:49 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
这样写:


// 在此输入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 的生命周期由容器管理。
noxel

悄悄话
发表文章: 25
注册时间: 2003年09月16日 11:18
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月17日 10:41 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
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这部分的源码我大约看懂了,但是不是很有把握,遇到什么问题,还要向大家多请教。
noxel

悄悄话
发表文章: 25
注册时间: 2003年09月16日 11:18
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月17日 10:50 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
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这部分的源码我大约看懂了,但是不是很有把握,遇到什么问题,还要向大家多请教。
banq

悄悄话
发表文章: 9312
注册时间: 2002年08月03日 17:08
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月17日 14:48 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
如果觉得放在数据库中影响性能,可以放在内存cache中,只要将yung那段代码改写一下。

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





noxel

悄悄话
发表文章: 25
注册时间: 2003年09月16日 11:18
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月17日 15:12 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
> 如果觉得放在数据库中影响性能,可以放在内存cache中,只?> 将yung那段代码改写一下。

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

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

banq

悄悄话
发表文章: 9312
注册时间: 2002年08月03日 17:08
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月17日 15:29 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
论坛里我回复的语句不是很好,当时情急之下,向你道歉。

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

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

悄悄话
发表文章: 9
注册时间: 2003年09月09日 06:17
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月18日 03:20 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
Facade + HashMap is enough
anonymous

悄悄话
发表文章: 0
注册时间:
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月18日 05:18 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
数据库真的很慢吗?ejb也不怎么快的,呵呵。
实在不行,在容器外,写一个singleton类,把用户
信息写入singleton类中保存就可以了,这样是不是
够快?(集群恐怕不可以的)
集群干吗?你是不是要做游戏站点呀/
noxel

悄悄话
发表文章: 25
注册时间: 2003年09月16日 11:18
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月18日 10:02 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
to banq:
哪里,客气了,改jboss是狗急跳墙的方案,风险很大。
to yung & xok
如果不用集群,我现有的架构(非j2ee)就足够,现在就是想提高系统的容错性,因为down机一次,我们的损失就是一台服务器。




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

大家看看是否可行。
anonymous

悄悄话
发表文章: 0
注册时间:
Re: 急切请教 如何遍历所有 stateful bean 多谢 2003年09月18日 19:26 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
行吗?
activity 和 passive 时怎么办?

这个主题有 14 回复 / 1Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com
anti spam