ejb local reference 概念问题

现在抄一段文章给大家看看,顺便提出概念问题。文章如下:

接下来,我们要介绍一个在BES比较特别的设定项目,大家都知道从EJB2.0之后,增加了对LOCAL INTERFACE的支持,目的就是为了避免在同一EJB CONTAINER内的EJB组件,还需透过JNDI这样一个远程呼叫去找到另一EJB组件。所以当即提出了EJB LOCAL REFERENCES这样一个解决方案,目的就是达到和LOCAL INTERFACE相同的一个功效。

文章后面接着说,这样标记上这个符号以后,EJB就可以透过他直接去找部署在本服务器上的其他组件,对系统提升又很打帮助。

我的问题是,1,请具体解释一下EJB LOCAL REFERENCE
2,他和EJB LOCAL INTERFACE的区别是什么???他是包容器特有的吗?是不是有的包容器有这个功能,有些没有????????

我先回答你的第二个问题:既然JCP将local interface定义在j2ee spec中了,那么所有的appServer的vendor都必须实现这个interface,不然就不可能是j2ee certificated的appServer,所以您提的第一个问题的答案是:所有宣称是j2ee compatiable的appServer都应具备或者说支持这个功能(当然罗,必须是EJB2.0 compatiable的)

关于您说的第二个问题,我建议您最好看看与distributed computation有关的书籍。因为这不是一句话可以解释清楚的。

还是莫名其妙啊,谁能直接解释一下啊

以前对ejb的调用必须是远程调用,现在有了local interface,就可以对其进行本地调用了。所谓本地就是指在同一个jvm内部的意思。

关注中。
“目的就是为了避免在同一EJB CONTAINER内的EJB组件,还需透过JNDI这样一个远程呼叫去找到另一EJB组件”这是不是说有了EJB LOCAL REFERENCES,同一个appserver内的ejb都可以通过本地接口来访问了?
可是我在WAS5.0上试验在一个war中通过EJB LOCAL REFERENCES引用已经部署好的另外一个ear中的EJB的本地接口,结果出错:


java.lang.ClassCastException: com.norteksoft.user.EJSLocalStatelessUserManageBeanHome_ffc78e49

请高手给我一个明确的答案:要通过本地接口访问EJB,客户断代码是必须和EJB存在于同一个EAR中还是只要存在于同一个appServer中就行?

首先需要搞清楚Java两个基本概念:reference引用和Interface接口的区别就可以了。

>>>>请高手给我一个明确的答案:要通过本地接口访问EJB,客户断代码是必须和EJB存在于同一个EAR中还是只要存在于同一个appServer中就行?

如果要调用EJB的local interface,那么EJB的client必须和EJB在同一个JVM的instance中。按你的说法是必须在同一个appServer上,如果你所说的appServer不是一个clustering的环境。

> 如果要调用EJB的local interface,那么EJB的client必须和EJB在同一个JVM的instanc
> 中。按你的说法是必须在同一个appServer上,如果你所说的a
> pServer不是一个clustering的环境。

可是我在WAS5.0上试验在一个war中通过EJB LOCAL REFERENCES引用已经部署好的另外一个ear中的EJB的本地接口,结果出错:


java.lang.ClassCastException: com.norteksoft.user.EJSLocalStatelessUserManageBeanHome_ffc78e49

我乃楼主,怎么说着说着就跑题了?我问的是EJB LOCAL REFERENCES,怎么撤到LOCAL INTERFACE了??

LOCAL INTERFACE我当然知道啦,比remote interface有效率多了,但我不是问这个。

“所以当即提出了EJB LOCAL REFERENCES这样一个解决方案,目的就是达到和LOCAL INTERFACE相同的一个功效。”

从上面这句话看出这两个东西不是同一个东西,我就是想知道区别是什么? 我有个猜想不知道对不对:如果设置了这个属性,那么知道在同一个环境里面(也就是可以本地接口查找了),那就连本地接口查找都不用了,服务器会用EJB LOCAL REFERENCES的方式查找。这个方式比LOCAL INTERFACE查找效率还要高,不过由于查找代码是我们写的,所以代码里面还是写的用LOCAL INTERFACE查找,服务器会自动帮我们转换查找方式。
不知道我上面说法对不对???请大师们指点啊~~~~~~~~~

LOCAL REFERENCES最大的好处是:你不需要把要调用的EJB的JNDI名字硬编码到你的代码中(.lookup("ejbjndiname")),而是现在配置文件里声明对该EJB的访问,然后对ejbreferencename编码
(.lookup("ejbreferencename")),在部署的时候,再把这个ejbreferencename绑定到EJB的JNDI名字上。

我的问题谁来回答呀?????????????

to henry.t daquan198163

我认为你们两个问题其实还是同一个问题,REFERENCE NAME其实是在调用者和被调用者之间的一个中间者,以达到调用者和被调用者完全解耦,不使用REFERENCE NAME也可以。

调用者--->JNDI ---> REFERENCE NAME ---> 被调用者的Home接口

to daquan198163
根据我的经验,必须要在同一个EAR里面,如果不是就不可以了。
小弟也是初学不久,所以,呵呵,还是帮你顶一个了

to henry.t,我最近终于把这个问题弄懂了,和大家分享一下:)
正如jrog所说,如果要调用EJB的local interface,那么EJB的client必须和EJB在同一个JVM的instance中,但这只是一个必要条件,而不是充分条件,这还与ClassLoader有关,即EJB的client还必须和EJB由同一个ClassLoader加载。
这样,一个WAR就可以通过本地接口访问同一个服务器中的EJB而不需要跟那个EJB打包成一个EAR了。
JBoss默认的是由单个ClassLoader加载所有的应用,所以不存在什么问题(在我的另一个贴子里banq是这么说的),而对于WebSphere它既可以设置成采用单个ClassLoader加载所有的应用,也可以设置成每个应用由单独的ClassLoader加载,默认的是后者!

老板让我研究一下在JBoss上部署EJB,谁能给我讲讲基本步骤和方法,比如配置数据源、配置各种资源的JNDI引用……