使用jndi获取websphere服务器全名

aamkag61  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(444)

在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

我想知道它的价值 pqr 在上面的两行中显示了在websphere服务器上运行的应用程序中使用java代码。我发现我可以得到 `` 以及 xyz 通过执行jndi查找,根据对另一个问题的回答:

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

但是,“servername”的jndi查找不会返回 pqr 或者以上任何一个值,但完全是另一个值。
如何获得价值 pqr (或整个值) \xyz\pqr 或者 \xyz\pqr-1234 ,以可能的为准)?我更希望通过执行jndi查找来获得值,而不是像这里提到的那样使用像com.ibm.websphere.runtime.servername这样的websphere类,但是如果这不可能,我可以使用任何有效的解决方案。
我意识到可能有关于为什么我需要获得价值的问题,甚至可能有观点认为获得价值可能不是一个好的实践等。然而,我有一个有效的和不可避免的理由这样做。

p5cysglq

p5cysglq1#

下面是一个指向有关如何捕获websphere命名空间转储的文档的链接,包括示例输出,其中显示了以下条目:,

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

你有没有试过查一下下面的内容?

thisNode/servers/thisServer/servername
vlf7wbxs

vlf7wbxs2#

这个答案不是jndi解决方案,但是它是这个问题的解决方案。websphere提供了类com.ibm.websphere.runtime.servername,该类正是用于此场景的。它有许多实用方法,如:
getdisplayname()
getserverid()
getfullname()
那么,如何在项目中使用这个类,同时仍然能够在非websphere环境中部署项目呢?通过在运行时检查您是否在websphere中运行,如果您在运行,则调用servername中的方法。
为了避免不必要的依赖关系污染您的项目,请创建一个新的实用程序jar项目并添加依赖关系:
com.ibm.ws.runtime-x.jar作为提供的依赖项(was或was客户端的一部分)
spring-core-x.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语句的需要,并使代码更加“简单”。但想法还是一样。

相关问题