在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查找来获得值abc
和xyz
(new InitialContext()).lookup("thisNode/cell/cellname").toString(); // returns "abc"
(new InitialContext()).lookup("thisNode/nodename").toString(); // returns "xyz"
然而,";服务器名称";不返回pqr
或上面的任何值,而是完全返回其他值。
如何获取值pqr
(或整个值abcxyzpqr
或abcxyzpqr-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语句的需要,并使代码更加"简单";更简单";。但这个想法将保持不变。