我有一个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
的应用程序相同)
无接口调用是本地调用