开发者

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

I have a EJB bean that exposed to two interface like below: Local interface is for my web app, and Remote interface is for my App Client

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

so my App Client looks as below. Remote method invocation is happened in this case

public class Main {
   @EJB
   private static CoreMainEJBRemote coreEJBRemote;

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

From my web app开发者_Python百科 I invoke as below. Local method invocation is happened in this case

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

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

So here is my question, If the EJB only exposed @Remote interface, but in your web app, you inject the EJB bean directly instead of its Remote interface, will this trigger a remote invocation or local invocation? For example:

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

and in the web app, I do this

@EJB
private CoreMainEJB coreMainEJB;

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


The last example as given will simply not work. Since CoreMainEJB already implements a remote interface, the container will not create a No-Interface view. This is exactly the case for which @LocalBean is intended.

So to answer the question 'Is this local or remote invocation here?' directly: it's neither. The container will not be able to inject anything and probably barf out at the deployment stage.

If you define your bean as:

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

Then local semantics will apply here:

@EJB
private CoreMainEJB coreMainEJB;

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

(assuming the above code fragment is in the same application as where CoreMainEJB is defined of course)


A no-interface invocation is a local invocation.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜