簡體   English   中英

遠程JNDI查找返回我自己的EJB

[英]Remote JNDI lookup returning my own EJB

這是我在Stack Overflow上遇到的第一個問題,請隨時告訴我是否做錯了:)

我正在從事一個涉及EJB和JBoss 4.2.3.GA的項目。 有一點,我們嘗試訪問集群的每個節點,找到一個EJB並返回它。

這是執行JNDI查找的代碼:

public static <I> I getCache(Class<I> i, String clusterNode) {
    ServiceLocator serviceLocator = ServiceLocator.getInstance();
    String jndi = serviceLocator.getRemoteJNDIName(i);

    Properties props = new Properties();
    props.setProperty(Context.PROVIDER_URL, "jnp://" + clusterNode + ":"
            + jndiPort);
    props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming");
    props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
            "org.jnp.interfaces.NamingContextFactory");
    Object result = null;
    try {
        InitialContext ctx = new InitialContext(props);
        result = ctx.lookup(jndi);
    } catch (NamingException e) {
        return null;
    }

    return (I) result;
}

這里:

  • clusterNode是一個簡單的字符串,其中包含節點的IP地址或dns名稱。 例如:“ 192.168.2.65”或“ cluster1”。
  • getRemoteJNDIName返回如下字符串:“ MyEARName / MyEJBName / remote”

問題是,當我使用“ 127.0.0.1”調用此方法時,它可以正常工作。 另外,如果我使用服務器已啟動並正在運行的現有且可用的IP地址來調用它,也可以。

但是,如果我使用不存在或無法使用的地址或dns名稱調用該方法,而不是拋出NamingException,則它會在我自己的計算機中返回EJB。 因此,我不知道該節點是否啟動。

我猜可能會有更好的方法。 我希望聽到有關它們的信息,但是由於該產品已經生產了幾年,因此我們無法對其進行“大”更改。

而已。 謝謝您的期待和問候。

但是,如果我使用不存在或無法使用的地址或dns名稱調用該方法,而不是拋出NamingException,它會在我自己的計算機中返回EJB

我認為,如果您具有自動命名發現功能,則可以解釋這種現象。 如果未指定Contex.PROVIDER_URL或列表中的節點不可達(您的情況),則允許客戶端在網絡中搜索可用的JNDI服務。

但是,這僅在某些條件下才有效,其中有些條件是:所有群集節點都在ALL模式下運行,所有節點都位於同一子網中。

您可以通過設置InitialContext屬性jnp.disableDiscovery=true來禁用此行為。

我想可能會有更好的方法

根據代碼,您沒有捕獲從JNDI輪詢的對象,這意味着每次您需要執行服務時,都必須進行新的查找(這是一項耗時的操作)。 ServiceLocator模式建議緩存查找結果以提高性能。

暫無
暫無

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

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