繁体   English   中英

如果EJB暴露了@Remote接口,但是您注入了EJB bean而不是其Remote接口,那么这会触发远程或本地调用吗?

[英]If EJB exposed @Remote interface, but you inject the EJB bean instead of its Remote interface, will this trigger a remote or local invocation?

我有一个暴露于两个接口的EJB bean,如下所示:本地接口用于我的Web应用程序,Remote接口用于我的App Client

@Stateless
public class CoreMainEJB implements CoreMainEJBRemote, CoreMainEJBLocal {
    //...
}

所以我的App Client如下所示。 在这种情况下发生远程方法调用

public class Main {
   @EJB
   private static CoreMainEJBRemote coreEJBRemote;

   public static void main(String[] args) {
        coreEJBRemote.process(args[0]);       
   }
}

从我的网络应用程序,我调用如下。 在这种情况下发生本地方法调用

@ManagedBean
@RequestScoped
public class DisplayInbound {
    @EJB
    private CoreMainEJBLocal coreMainEJBLocal;

    public void processPackages() {
        coreMainEJBLocal.process(...);   
    }
}

所以这是我的问题, 如果EJB只暴露了@Remote接口,但是在您的Web应用程序中,您直接注入EJB bean而不是其Remote接口,这会触发远程调用还是本地调用? 例如:

@Stateless
public class CoreMainEJB implements CoreMainEJBRemote{
    //...
}

在网络应用程序中,我这样做

@EJB
private CoreMainEJB coreMainEJB;

public void processPackages() {
    coreMainEJB.process(...);   //Is this local or remote invocation here?
}

给出的最后一个例子根本不起作用。 由于CoreMainEJB已实现远程接口,因此容器不会创建无接口视图。 这正是@LocalBean用途。

所以回答这个问题' 这是本地或远程调用吗? '直接:它既不是。 容器将无法注入任何东西,并且可能在部署阶段进行barf。

如果将bean定义为:

@Stateless
@LocalBean
public class CoreMainEJB implements CoreMainEJBRemote{
    //...
}

然后本地语义将适用于此:

@EJB
private CoreMainEJB coreMainEJB;

public void processPackages() {
    coreMainEJB.process(...);   // Local semantics
}

(假设上面的代码片段与CoreMainEJB定义的应用程序在同一个应用程序中)

无接口调用是本地调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM