我有一个简单的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还是从远程服务器完成?
而且,这种区别(对于本地和远程调用)是否与“查找”的语义相冲突? (对于一个名称,应该只有零个或一个对象注册,在这种情况下,似乎有两个同名的对象(本地和远程)。
谢谢。
答案 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 应用。
这应该解释行为