决定返回本地或远程

时间:2013-02-19 19:05:53

标签: java java-ee ejb jndi

我有一个简单的bean声明如下

 @Local(LocalInt.class)
 @Remote(RemoteInt.class)
 @Stateless(name="name")
 public MyEJB_Implementation {
    //methods
 }

如您所见,它是一个单独的bean,具有本地接口(用于本地客户端)和远程接口(用于远程接口)。

客户端(远程和本地)按如下方式检索实例:

ctx = new InitialContext(environment);
ctx.lookup("name");

Container如何确定是否会提供实现LocalInt接口或RemoteInt接口的代理? (因为我使用相同的“名称”进行查找)。

我的意思是,JNDI注册表是否知道查找是在同一个JVM还是从远程服务器完成?

而且,这种区别(对于本地和远程调用)是否与“查找”的语义相冲突? (对于一个名称,应该只有零个或一个对象注册,在这种情况下,似乎有两个同名的对象(本地和远程)。

谢谢。

4 个答案:

答案 0 :(得分:3)

根据我的经验,当客户端位于同一容器(EAR或WAR)中时,容器将返回local接口,而当它在其外部时将返回remote接口。

我不确定它是Java EE规范中的要求,但几乎所有标准容器都采用这种方式(再次,根据我的经验)

答案 1 :(得分:1)

EJB容器将本地和远程接口绑定到不同的JNDI名称,因此它取决于您查找的是哪一个。例如,在EJB 3.1中,标准绑定位置将是这样的:

java:app/YourEJBModule/YourEJBName!com.your.pkg.LocalInt
java:app/YourEJBModule/YourEJBName!com.your.pkg.RemoteInt

答案 2 :(得分:0)

Jndi具有很强的语境能力。即使您认为您使用的是绝对名称,它们通常也与您正在进行查找的当前组件相关。

我很惊讶“名字”有效。这实际上是针对不同的命名空间(非JNDI)。

答案 3 :(得分:0)

第3节中的EJB 3.1规范清楚地解释了本地和远程视图。在第3.3.2节中,它说

  

会话bean可能有本地客户端。本地客户端是客户端   与提供的会话bean在同一个JVM中并置   本地客户端视图,可以与bean紧密耦合。一个   会话bean的本地客户端可以是另一个企业bean或web   零件。通过本地客户端视图访问企业bean   需要在本地客户端和本地客户端的同一JVM中进行并置   提供本地客户端视图的企业bean。本地的   因此,客户端视图不提供位置透明性   由远程客户端视图提供。访问企业bean   通过本地客户端视图只需要支持   本地客户与企业在同一应用程序中打包   提供本地客户端视图的bean。符合标准的实现   此规范可以选择支持对本地客户端的访问   从包装在不同的本地客户端查看企业bean   应用。

这应该解释行为