[英]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;
}
這里:
問題是,當我使用“ 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.