3

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

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

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

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

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

容器如何决定它是否将交付实现LocalInt接口或RemoteInt接口的代理?(因为我使用相同的“名称”进行查找)。

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

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

谢谢你。

4

4 回答 4

3

以我的经验,local当客户端在同一个容器(EAR 或 WAR)中时,容器将返回接口,而在它之外时将返回remote接口。

我不确定 Java EE 规范中是否将其声明为要求,但几乎所有标准容器都以这种方式运行(再次,根据我的经验)

于 2013-02-19T20:41:20.337 回答
1

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

java:app/YourEJBModule/YourEJBName!com.your.pkg.LocalInt
java:app/YourEJBModule/YourEJBName!com.your.pkg.RemoteInt
于 2013-02-20T06:38:59.570 回答
0

Jndi 是高度上下文相关的。即使您认为您使用的是绝对名称,它们通常也与您正在从中进行查找的当前组件相关。

我很惊讶“名称”有效。这实际上是为不同的命名空间(非 JNDI)设计的。

于 2013-02-21T09:35:41.153 回答
0

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

会话 bean 可能有本地客户端。本地客户端是与会话 bean 并置在同一个 JVM 中的客户端,会话 bean 提供本地客户端视图并且可能与 bean 紧密耦合。会话 bean 的本地客户端可以是另一个企业 bean 或 Web 组件。通过本地客户端视图访问企业 bean 需要在同一 JVM 中配置本地客户端和提供本地客户端视图的企业 bean。因此,本地客户端视图不提供远程客户端视图提供的位置透明度。通过本地客户端视图访问企业 bean 只需要被打包在与提供本地客户端视图的企业 bean 相同的应用程序中的本地客户端支持。

那应该解释这种行为

于 2013-02-21T12:03:34.453 回答