簡體   English   中英

使用 JNDI 獲取 WebSphere 完整服務器名稱

[英]Getting WebSphere full server name using JNDI

在 WebSphere 日志文件的頂部,我看到幾行:

WebSphere Platform 8.5 blah blah running with process name abc\xyz\pqr and process id 1234
Full server name is abc\xyz\pqr-1234

我想在運行在 WebSphere 服務器上的應用程序中使用 Java 代碼來獲取上面兩行中顯示的值pqr 我發現根據對另一個問題的回答,我可以通過執行 JNDI 查找來獲取值abcxyz

(new InitialContext()).lookup("thisNode/cell/cellname").toString();    // returns "abc"
(new InitialContext()).lookup("thisNode/nodename").toString();     // returns "xyz"

但是,“servername”的 JNDI 查找不會返回pqr或上述任何值,而是完全其他的東西。

如何獲得pqr值(或整個值abc\\xyz\\pqrabc\\xyz\\pqr-1234 ,以可能的為准)? 我更願意通過執行 JNDI 查找而不是使用像這里提到的 com.ibm.websphere.runtime.ServerName 這樣的 WebSphere 類來獲取值,但如果這是不可能的,我可以使用任何有效的解決方案。

我意識到可能會有關於為什么我需要獲得價值的問題,甚至可能認為獲得價值可能不是一個好的做法等。但是,我有一個有效且不可避免的理由這樣做。

這是有關如何捕獲 WebSphere 名稱空間轉儲文檔的鏈接,包括示例輸出,顯示條目,例如,

(top)/nodes/outpost/nodename 
(top)/nodes/outpost/servers/server1/servername

您是否嘗試過查看以下內容?

thisNode/servers/thisServer/servername

好吧,這個答案不是JNDI解決方案,但它是這個問題的解決方案。 WebSphere 提供了com.ibm.websphere.runtime.ServerName類,它正是用於這個場景。 它有一堆實用方法,例如:

  • 獲取顯示名稱()
  • 獲取服務器 ID()
  • 獲取全名()

那么如何在您的項目中使用這個類,同時仍然能夠在非 websphere 環境中部署項目呢? 如果您在 WebSphere 中運行,則通過檢查運行時,如果您這樣做,則調用ServerName 中的方法。

為了不讓不必要的依賴項污染您的項目,以便運行時創建一個新的實用程序 jar 項目並添加依賴項:

  • com.ibm.ws.runtime-xxxx.jar 作為提供的依賴項(曾經或曾經是客戶端的一部分)
  • spring-core-xxxx.jar 作為運行時依賴

其余的解決方案是在兩個類中遵循兩種方法。 一個檢查 websphere 的存在和其他與之交互的:

import org.springframework.util.ClassUtils;

public class WasInfo {

    /** 
     * @return a map populated with relevant WebSphere names
     *         if running on WebSphere or empty one if not
     */
    public Map<String, String> about() {
        ClassLoader currentClassLoader = this.getClass().getClassLoader();
        boolean isWebsphere = ClassUtils.isPresent("com.ibm.websphere.runtime.ServerName", currentClassLoader);
        if (!isWebsphere ) {
            return new HashMap<>();
        }
        
        WebSphereConfig wc = new WebSphereConfig();
        return wc.resolveServerName();
    }       
}


import com.ibm.websphere.runtime.ServerName;

public class WebSphereConfig {      
    public Map<String, String> resolveServerName() {
        // expecting 'cell/node/server' pattern     
        String serverFullName = ServerName.getFullName();
        String serverName = ServerName.getDisplayName();        
        
        Map<String, String> map = new HashMap<>();
        map.put("serverFullName", serverFullName);
        map.put("serverName", serverName);      
        
        String[] segments = serverFullName.split("\\\\");
        if (segments.length == 3) {
            map.put("cellName", segments[0]);
            map.put("nodeName", segments[1]);
        }
    }   
}

在這個例子中,我使用了 Spring 的 ClassUtils 來擺脫一些無聊的代碼。 對於練習,可以使用反射調用 ServerName 方法。 這將消除對 import ServerName 語句的需要,並使代碼更加“簡單”。 但想法將保持不變。

暫無
暫無

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

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