Topic: [问]Stateful SessionBean的互相调用

  Print this page

1.[问]Stateful SessionBean的互相调用 Copy to clipboard
Posted by: Jove
Posted on: 2004-01-10 11:22

SessionBean调用Entity Bean,或是一个EJB调用一个Stateless SessionBean都没有问题
请问,Stateful SessionBean之间怎么调用

比如管理用户信息的SessionBean,保存的是用户的信息,包括权限等
另有一些处理数据或是商业方法的SessionBean,调用他们的方法时需要检查用户是否有特定的权限
当然,用户id可以作为参数传进去,或是在ejbCreate中传进去
但这样都不太理想

最好是在后者的EJB中有一个前者的引用,如
public class SessionBean_1 ...{
private SessionBean_2 sb2;
...
}

或者有什么办法,查到同一session的其他bean?

在一本书上,看到如下文字,但不太理解
访问企业Bean的远程对象引用
有时你的企业Bean 需要提供一个自己的引用给其他企业Bean。例如你可以通过引用使企业Bean 可以调
用另一个企业Bean的方法。你无法访问this引用因为它指向在EJB容器中运行的Bean实例,只有容器
可以直接调用Bean实例的方法。客户端通过远程接口实现对象间接调用Bean的方法,通过这些对象(远
程接口实现对象)的引用企业Bean可以互相访问。
会话Bean调用SessionContext接口定义的getEJBObject方法获得它的远程接口对象引用。而实体Bean
调用的是EntityContext 接口定义的getEJBObject 方法。这两个借口提供企业Bean 访问EJB 容器管理
的上下文对象。典型情况下,企业Bean通过setSessionContext方法保存它的上下文对象。


//bow

2.Re:[问]Statefull SessionBean的互相调用 [Re: Jove] Copy to clipboard
Posted by: Jove
Posted on: 2004-01-10 12:43

继续查资料,看到可以调用EJBObject的getHandle(),这是一个可以序列化的东东
打算用这个作为ejbCreate的参数,生成其他SessionBean实例
Context ctx=new InitialContext(props);
..
FooHome fooHome=..
Foo foo=fooHome.create();
BarHome barHome=..
Bar bar=barHome.create(foo.getHandle());
bar.someMethodRelatedToFoo();


请问这样做符合常规吗?

3.Re:[问]Stateful SessionBean的互相调用 [Re: Jove] Copy to clipboard
Posted by: hitaco
Posted on: 2004-01-12 13:33

首先,要尽量避免使用过多的或者不必要的SFSB:
1) Resource intersive, may not be scaled well in future.
2) Additional logic should be applied to keep SFSB in sych with the underlying transactional resource, for example, SessionSynchronization interface maybe implemented in this situation.

其次,经过考虑必须要用多个SFSB的情况, 可以使用callback, 就象你引用的那段文字里说明的:
不能用this, 因为必须要通过EJBObject来访问Bean类,EJBObject作为proxy object,提供transparent security management and transaction services.

Jove wrote:
SessionBean调用Entity Bean,或是一个EJB调用一个Stateless SessionBean都没有问题
请问,Stateful SessionBean之间怎么调用

比如管理用户信息的SessionBean,保存的是用户的信息,包括权限等
另有一些处理数据或是商业方法的SessionBean,调用他们的方法时需要检查用户是否有特定的权限
当然,用户id可以作为参数传进去,或是在ejbCreate中传进去
但这样都不太理想

最好是在后者的EJB中有一个前者的引用,如
public class SessionBean_1 ...{
private SessionBean_2 sb2;
...
}

或者有什么办法,查到同一session的其他bean?

在一本书上,看到如下文字,但不太理解

//bow

4.Re:[问]Statefull SessionBean的互相调用 [Re: Jove] Copy to clipboard
Posted by: hitaco
Posted on: 2004-01-12 13:37

I don't think it is good to use EJB handler in this way.
记得Master EJB一书作者对于EJB handler(both home handler or remote handler) 有这么一段评价,具体忘记了,大概的意思是“几乎没看到过有应用去依赖handler,如果你用了,就发mail让他知道。”

另外问一下,你要用handler的话,是不是你的两个SFSB都是Remote的?

Jove wrote:
继续查资料,看到可以调用EJBObject的getHandle(),这是一个可以序列化的东东
打算用这个作为ejbCreate的参数,生成其他SessionBean实例
Context ctx=new InitialContext(props);
..
FooHome fooHome=..
Foo foo=fooHome.create();
BarHome barHome=..
Bar bar=barHome.create(foo.getHandle());
bar.someMethodRelatedToFoo();


请问这样做符合常规吗?

5.Re:[问]Statefull SessionBean的互相调用 [Re: hitaco] Copy to clipboard
Posted by: Jove
Posted on: 2004-01-12 13:48

hitaco wrote:
I don't think it is good to use EJB handler in this way.
记得Master EJB一书作者对于EJB handler(both home handler or remote handler) 有这么一段评价,具体忘记了,大概的意思是“几乎没看到过有应用去依赖handler,如果你用了,就发mail让他知道。”

另外问一下,你要用handler的话,是不是你的两个SFSB都是Remote的?


是,这两个SFSB都是Remote的
并希望两者之间能够通讯. i.e A能得到B的信息,而不是在A中新建一个B的实例

请问有什么更合适的解决方法? //bow

6.Re:[问]Stateful SessionBean的互相调用 [Re: Jove] Copy to clipboard
Posted by: hitaco
Posted on: 2004-01-12 13:54

有没有可能把其中一个搞成不是SF的。

如果都是SF, 你要处理这样的问题,如果一个timeout? 这个引用是invalid reference

7.Re:[问]Statefull SessionBean的互相调用 [Re: Jove] Copy to clipboard
Posted by: hitaco
Posted on: 2004-01-12 14:01

public ABean implements SessionBean {

private BEJBObject b;

public void ejbCreate(Long userId) {
// initialize ABean;

1. lookup home object of B from jndi env
2. call corresponding create method of BHome
3. initialize the BEJBObject
}
}

代码如上,这样就保证了一一对应, 如果你要的不是在A中创建B,那我想,你的B可不可以不是SFSB,因为SFSB代表着用户的会话。

Jove wrote:
是,这两个SFSB都是Remote的
并希望两者之间能够通讯. i.e A能得到B的信息,而不是在A中新建一个B的实例

请问有什么更合适的解决方法? //bow

8.Re:[问]Stateful SessionBean的互相调用 [Re: hitaco] Copy to clipboard
Posted by: Jove
Posted on: 2004-01-12 14:02

如果不考虑invalid reference和分布式
两个SFSB之间相互调用/相互引用是不是可行?

那些EJB项目中,难道不出现SFSB相互调用的情形吗?这是一种Anti-Pattern?

不好意思,第一次做EJB的项目,问题多多 Blush

9.Re:[问]Stateful SessionBean的互相调用 [Re: Jove] Copy to clipboard
Posted by: cknight
Posted on: 2004-01-12 14:03

两个Stateful SessionBean互相访问也是通过jndi查找对应对方的home接口,然后create远程接口,再调用对应的方法。
和Stateless SessionBean之间的调用在形式上并没有很大区别。

你的两个session bean想必都是stateful的吧。你似乎过多的使用了SFSB。
用户信息,如权限等可以放在SFSB,但建议放在http session中。
商业方法尽可以使用SLSB。

SFSB的特点是在多个商业逻辑的调用中可以保持会话状态,可以保证跨函数的保持中间状态。
这里强调的是一定的商业逻辑,像权限认证我觉得不属于商业逻辑之列。

10.Re:[问]Stateful SessionBean的互相调用 [Re: Jove] Copy to clipboard
Posted by: hitaco
Posted on: 2004-01-12 14:04

of course you can, see the peudo-code above

Jove wrote:
如果不考虑invalid reference和分布式
两个SFSB之间相互调用/相互引用是不是可行?

那些EJB项目中,难道不出现SFSB相互调用的情形吗?这是一种Anti-Pattern?

不好意思,第一次做EJB的项目,问题多多 Blush

11.Re:[问]Stateful SessionBean的互相调用 [Re: cknight] Copy to clipboard
Posted by: Jove
Posted on: 2004-01-12 14:08

多谢指教
可惜现在做的是C/S项目,要是能像B/S一样,直接到HttpSession中取信息就不用愁了

多谢各位的耐心解答,我想暂时还是按hitaco大侠的建议进行实现
看到什么更好的方法再改进

12.Re:[问]Stateful SessionBean的互相调用 [Re: cknight] Copy to clipboard
Posted by: hitaco
Posted on: 2004-01-12 14:09

权限之类的东西通常属于non-functional requirement.

对于你说的放在http session,我一半同意,当web app时候,的确最好的开发方式是SLSB,这样保证系统的scalable, 但如果要考虑client端未必是web的话,那就必须用SFSB了,但我总觉得只应该有一个SFSB管理用户会话,将数据组装成更合理的方式去调用SLSB/EntityBean/DAO

cknight wrote:
两个Stateful SessionBean互相访问也是通过jndi查找对应对方的home接口,然后create远程接口,再调用对应的方法。
和Stateless SessionBean之间的调用在形式上并没有很大区别。

你的两个session bean想必都是stateful的吧。你似乎过多的使用了SFSB。
用户信息,如权限等可以放在SFSB,但建议放在http session中。
商业方法尽可以使用SLSB。

SFSB的特点是在多个商业逻辑的调用中可以保持会话状态,可以保证跨函数的保持中间状态。
这里强调的是一定的商业逻辑,像权限认证我觉得不属于商业逻辑之列。

13.Re:[问]Stateful SessionBean的互相调用 [Re: Jove] Copy to clipboard
Posted by: cknight
Posted on: 2004-01-12 15:21

client端不是web的项目我还没有做过。我上面说得是针对web项目的。
在web项目中,我把SFSB理解成,SFSB就是一种经过容器封装过的类似http session的bean。

所以即使能够使用SFSB,我也想法把它分解成 SLSB + http session。

你说的“一个SFSB管理用户会话,将数据组装成更合理的方式去调用SLSB/EntityBean/DAO。”
那么相当于这个SFSB充当了一个客户相关的持久化对象了。

我也想问问,
对于web客户端而言,SFSB的远程接口一般是存储在http session中。
那么对于非这个web的客户端 这个SFSB的远程接口是如何在客户端被存储的呢?

14.Re:[问]Stateful SessionBean的互相调用 [Re: cknight] Copy to clipboard
Posted by: hitaco
Posted on: 2004-01-12 15:36

The most significant differences between HttpSession and SFSB approaches are:
1) SFSB is remote accessible
2) SFSB is transactional-aware

至于这个remote object(stub)如何被client端cache,这个因应用而异

cknight wrote:
client端不是web的项目我还没有做过。我上面说得是针对web项目的。
在web项目中,我把SFSB理解成,SFSB就是一种经过容器封装过的类似http session的bean。

所以即使能够使用SFSB,我也想法把它分解成 SLSB + http session。

你说的“一个SFSB管理用户会话,将数据组装成更合理的方式去调用SLSB/EntityBean/DAO。”
那么相当于这个SFSB充当了一个客户相关的持久化对象了。

我也想问问,
对于web客户端而言,SFSB的远程接口一般是存储在http session中。
那么对于非这个web的客户端 这个SFSB的远程接口是如何在客户端被存储的呢?


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923