Java 使用JNDI获取WebSphere完整服务器名
在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 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()
- com.ibm.ws.runtime-xxxx.jar作为提供的依赖项(was或was客户端的一部分)
- spring-core-xxxx.jar作为运行时依赖项
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()
- com.ibm.ws.runtime-xxxx.jar作为提供的依赖项(was或was客户端的一部分)
- spring-core-xxxx.jar作为运行时依赖项
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