如果EJB公开了@Remote接口,但是您注入的是EJB bean而不是它的Remote接口,这会触发远程调用还是本地调



我有一个EJB bean,它暴露给如下两个接口:本地接口用于我的web应用程序,远程接口用于我的应用程序客户端

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

所以我的应用程序客户端看起来如下。在这种情况下发生了远程方法调用

public class Main {
   @EJB
   private static CoreMainEJBRemote coreEJBRemote;
   public static void main(String[] args) {
        coreEJBRemote.process(args[0]);       
   }
}

从我的web应用程序我调用如下。本例中发生了局部方法调用

@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{
    //...
}

在web应用程序中,我这样做

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

给出的最后一个示例根本不起作用。由于CoreMainEJB已经实现了一个远程接口,容器将而不是创建一个No-Interface视图。这正是@LocalBean所要实现的情况。

所以要回答这个问题'这里是本地调用还是远程调用?' direct:两者都不是。容器将无法注入任何东西,并可能在部署阶段呕吐。

如果您将bean定义为:

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

那么本地语义将适用于这里:

@EJB
private CoreMainEJB coreMainEJB;
public void processPackages() {
    coreMainEJB.process(...);   // Local semantics
}

(假设上述代码片段与定义CoreMainEJB的应用程序相同)

无接口调用是本地调用

相关内容

  • 没有找到相关文章

最新更新