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

Java 使用JNDI获取WebSphere完整服务器名,java,websphere,jndi,Java,Websphere,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 Initia

在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类,但是如果这不可能,我可以使用任何有效的解决方案

我意识到可能会有关于我为什么需要获取该值的问题,甚至可能会有人认为获取该值可能不是一个好的做法等。但是,我有一个有效且不可避免的理由这样做。

这里有一个链接到一个,包括示例输出,显示如下条目:

(top)/nodes/outpost/nodename 
(top)/nodes/outpost/servers/server1/servername
您是否尝试查找以下内容

thisNode/servers/thisServer/servername
下面是一个指向的链接,包括示例输出,显示如下条目:

(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中的方法

为了不让was运行时不必要的依赖项污染您的项目,请创建一个新的utility jar项目并添加依赖项:

  • com.ibm.ws.runtime-xxxx.jar作为提供的依赖项(was或was客户端的一部分)
  • spring-core-xxxx.jar作为运行时依赖项
其余的解决方案采用以下两种方法,其中包含两个类。一个用于检查websphere是否存在,另一个用于与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]);
        }
    }   
}
import org.springframework.util.ClassUtils;
公共类WasInfo{
/** 
*@返回用相关WebSphere名称填充的映射
*如果在WebSphere上运行,则为空
*/
公共地图关于(){
ClassLoader currentClassLoader=this.getClass().getClassLoader();
布尔值isWebsphere=ClassUtils.isPresent(“com.ibm.websphere.runtime.ServerName”,currentClassLoader);
如果(!isWebsphere){
返回新的HashMap();
}
WebSphereConfig wc=新的WebSphereConfig();
返回wc.resolveServerName();
}       
}
导入com.ibm.websphere.runtime.ServerName;
公共类WebSphereConfig{
公共映射resolveServerName(){
//应为“单元/节点/服务器”模式
字符串serverFullName=ServerName.getFullName();
字符串serverName=serverName.getDisplayName();
Map Map=newhashmap();
put(“serverFullName”,serverFullName);
map.put(“serverName”,serverName);
String[]segments=serverFullName.split(“\\”);
如果(分段长度==3){
map.put(“cellName”,段[0]);
map.put(“节点名”,段[1]);
}
}   
}
在本例中,我使用Spring的ClassUtils删除了一些枯燥的代码。对于练习,可以使用反射调用ServerName方法。这将消除对importservername语句的需要,并使代码更加“简单”。但想法将保持不变。

这个答案不是JNDI解决方案,但它是这个问题的解决方案。WebSphere提供了类com.ibm.WebSphere.runtime.ServerName,该类正是用于此场景的。它有许多实用方法,如:

  • getDisplayName()
  • getServerId()
  • getFullName()
那么,如何在项目中使用这个类,同时仍然能够在非websphere环境中部署项目呢?通过在运行时中检查您是否在WebSphere中运行,如果在WebSphere中运行,则不调用ServerName中的方法

为了不让was运行时不必要的依赖项污染您的项目,请创建一个新的utility jar项目并添加依赖项:

  • com.ibm.ws.runtime-xxxx.jar作为提供的依赖项(was或was客户端的一部分)
  • spring-core-xxxx.jar作为运行时依赖项
其余的解决方案采用以下两种方法,其中包含两个类。一个用于检查websphere是否存在,另一个用于与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]);
        }
    }   
}
import org.springframework.util.ClassUtils;
公共类WasInfo{
/** 
*@返回用相关WebSphere名称填充的映射
*如果在WebSphere上运行,则为空
*/
公共地图关于(){
ClassLoader currentClassLoader=this.getClass().getClassLoader();
布尔值isWebsphere=ClassUtils.isPresent(“com.ibm.websphere.runtime.ServerName”,currentClassLoader);
如果(!isWebsphere){
返回新的HashMap();
}
WebSphereConfig wc=新的WebSphereConfig();
返回wc.resolveServerName();
}       
}
导入com.ibm.websphere.runtime.ServerName;
公共类WebSphereConfig{
公共映射resolveServerName(){
//应为“单元/节点/服务器”模式
字符串serverFullName=ServerName.getFullName();
字符串serverName=serverName.getDisplayName();
Map Map=newhashmap();
put(“serverFullName”,serverFullName);
map.put(“服务器名”,serverN