使用JNDI获取WebSphere完整服务器名称



在WebSphere日志文件的顶部,我看到了几行:

WebSphere Platform 8.5 blah blah running with process name abcxyzpqr and process id 1234
Full server name is abcxyzpqr-1234

我希望在WebSphere服务器上运行的应用程序中使用Java代码来获得上面两行中显示的值pqr。根据对另一个问题的回答,我发现可以通过JNDI查找来获得值abcxyz

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

然而,";服务器名称";不返回pqr或上面的任何值,而是完全返回其他值。

如何获取值pqr(或整个值abcxyzpqrabcxyzpqr-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,该类正用于此场景。它有很多实用的方法,比如:

  • getDisplayName((
  • getServerId((
  • getFullName((

那么,如何在项目中使用此类,同时仍然能够在非websphere环境中部署项目?通过在运行时检查您是否在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语句的需要,并使代码更加"简单";更简单";。但这个想法将保持不变。

最新更新