簡體   English   中英

Websphere(和Weblogic / JBoss)中的遠程EJB查找

[英]Remote EJB lookup in Websphere (and Weblogic/JBoss)

我有一個用於搜索的EJB類,

@Local(ILuceneEmployeeSearchManagerLocal.class)
@Remote(ILuceneEmployeeSearchManagerRemote.class)
public class LuceneEmployeeSearchManager implements ILuceneEmployeeSearchManagerLocal, ILuceneEmployeeSearchManagerRemote{
....
}

同一個EAR中的WAR項目中還有另一個類,可以訪問它,

public class EmployeeAccessor {

    private ILuceneEmployeeSearchManagerRemote searcher;

    public EmployeeMstAccessor() {

        Context ic = null;
        try {
            Properties props = new Properties();
            props.put(Context.INITIAL_CONTEXT_FACTORY, "<WHAT_TO_PUT_HERE>");
            props.put(Context.PROVIDER_URL, "iiop://127.0.0.1:9083");
            ic = new InitialContext(props);
            this.searcher = (ILuceneEmployeeSearchManagerRemote) ic
                .lookup("<WHAT_TO_PUT_HERE?>");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    ....

}

當我使用JNDI執行本地查找時,這非常有效。 由於某些要求,現在需要在多個AP中部署EAR(在群集和非群集環境中)。 此外,所使用的應用程序服務器在AP之間是相同的,但不一定是Websphere,即所有AP都可能使用JBoss / Websphere / Weblogic。

我的問題是有一種獨立於實現的查找和調用遠程EJB的方法嗎? 適用於Websphere,Weblogic或JBoss環境(同構環境)的東西。

我的第二個問題是假設AP服務器正在運行Websphere(在集群或非集群環境中),比如說我希望所有AP服務器中的EmployeeAccessor都使用部署在AP01中的LuceneEmployeeSearchManager EJB(ip:xxxx,port:yy),我該如何配置? 是否有必要提供完整的JNDI名稱(包括websphere的單元名稱和節點名稱)? INITIAL_CONTEXT_FACTORY的正確值是什么? 什么是正確的JNDI查找語法?

感謝您的任何幫助 :)

您應該使用默認的InitialContext()構造函數 - 然后它與平台無關,並使用ejb引用 - 然后它與位置無關 - 您在安裝期間映射引用。 因此代碼是獨立的,但映射是特定於平台的,但是在應用程序之外完成。 如果您使用的是Java EE 6兼容服務器,則還可以使用注入@EJB.

所以你的代碼可能是這樣的:

public EmployeeMstAccessor() {

        Context ic = null;
        try {
            ic = new InitialContext();
            this.searcher = (ILuceneEmployeeSearchManagerRemote) ic
                .lookup("java:comp/env/ejb/ILuceneEmployeeSearchManagerRemoteRef");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

然后,您需要在Web模塊的web.xml中創建ejb/ILuceneEmployeeSearchManagerRemoteRef EJB引用,並將該引用映射到bean的JNDI名稱。 它可以在應用程序的安裝/配置期間完成,或者在WebSphere的情況下通過ibm-web-bnd.xml文件完成。

下面是帶有@EJB示例(這必須是用於Java EE 5的servlet或JSF managedBean,對於Java EE 6,您可以將它放在任何類中,但是您需要為應用程序啟用CDI):

public class MyServlet exetends HttpServlet {
    @EJB(name="ejb/ILuceneEmployeeSearchManagerRemote")
    private ILuceneEmployeeSearchManagerRemote searcher;  // replaces lookup
...}

再次,您需要將@EJB注釋定義的ejb/ILuceneEmployeeSearchManagerRemote引用映射到實際的JNDI名稱。

關於您的第二個問題(在WebSphere的情況下):

  • 如果bean位於SAME單元​​格上,但在其他服務器上,它將采用以下形式:

     cell/nodes/<node-name>/servers/<server-name>/<name binding location> 

    例如:

     cell/nodes/S47NLA1/servers/Server47A1/ejb/Department549/AccountProcessors/CheckingAccountReconciler 
  • 如果bean在外部單元格中,那么最好的方法是,如果要避免在Initial上下文中提供屬性(主機,端口,工廠),則使用已配置的綁定。 請記住,對於默認配置中的跨單元格,您必須交換SSL證書才能使其正常工作。

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM