簡體   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