[英]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 查找來獲取值abc
和xyz
:
(new InitialContext()).lookup("thisNode/cell/cellname").toString(); // returns "abc"
(new InitialContext()).lookup("thisNode/nodename").toString(); // returns "xyz"
但是,“servername”的 JNDI 查找不會返回pqr
或上述任何值,而是完全其他的東西。
如何獲得pqr
值(或整個值abc\\xyz\\pqr
或abc\\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類,它正是用於這個場景。 它有一堆實用方法,例如:
那么如何在您的項目中使用這個類,同時仍然能夠在非 websphere 環境中部署項目呢? 如果您在 WebSphere 中運行,則通過檢查運行時,如果您這樣做,則調用ServerName 中的方法。
為了不讓不必要的依賴項污染您的項目,以便運行時創建一個新的實用程序 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.