Java 获取WebSphere app Server的实例名称

Java 获取WebSphere app Server的实例名称,java,websphere,Java,Websphere,我的Web服务将在Jboss应用程序服务器或Websphere应用程序服务器上运行。对于它们,我都需要知道实例名,对于Jboss,我可以使用System.getProperty(“Jboss.server.name”),但是对于WebSphere,我可以使用什么?我不能使用特定于WebSphere的方法,我需要调用System.properties 感谢为了保持它与平台无关,您可以为Websphere服务器设置一个变量作为JVM参数(如果其集群化,则每个节点一个)。对于Websphere 7,您

我的Web服务将在Jboss应用程序服务器或Websphere应用程序服务器上运行。对于它们,我都需要知道实例名,对于Jboss,我可以使用
System.getProperty(“Jboss.server.name”),
但是对于WebSphere,我可以使用什么?我不能使用特定于WebSphere的方法,我需要调用System.properties


感谢

为了保持它与平台无关,您可以为Websphere服务器设置一个变量作为JVM参数(如果其集群化,则每个节点一个)。对于Websphere 7,您将在管理控制台中找到以下内容

Servers > Server Types > Websphere application servers > [your cluster node] >
  >  Java and Process Management  > Process Definition > Java Virtual Machine >
    > Generic JVM arguments 
然后添加一个如下的变量

-DServerName=serverNodeA
然后您可以访问代码中的值作为

String serverName = System.getproperty("ServerName");

只要您有权向JVM添加参数,此技术就可以用于所有应用程序服务器。我确信必须有特定于Websphere的API来查询节点名称,但是您正在向服务器键入代码,这使得单元测试变得困难,并且不可移植。我更喜欢这种方法。

布拉德建议的方法很好,但我会采取微妙的不同做法

在服务器JVM的自定义属性中,我将添加一个属性服务器名称,并将其值指定为WAS\u Server\u Name

这是面包屑:

服务器->->进程定义->Java虚拟机>自定义属性

添加一个值为${WAS\u SERVER\u NAME}的新服务器名

每个WAS服务器实例都将此WebSphere变量设置为服务器实例的名称。您不必担心打字错误(或类似错误),这种方法适用于所有WAS服务器

您可以使用设置为模板的值创建服务器,并且在创建新服务器时,这些值始终存在


HTH

我同意将服务器名称指定为环境变量(Manglu的触摸也很好)。为了完成讨论,下面是如何通过运行时获取实例名(此API在最新版本中已被弃用,但仍在使用中)

import com.ibm.websphere.runtime.ServerName;
System.out.println(“显示名称:”+ServerName.getDisplayName());
System.out.println(“全名:+ServerName.getFullName());
示例输出如下

显示名称:server1
全名:was7host01Node01Cell\was7host01Node01\server1


kurtcebe解决方案运行良好。对于那些使用maven的人,您将无法轻松地将jar放入您的项目中。因此,请使用Class.forname

try {
  Class<?> c = Class.forName("com.ibm.websphere.runtime.ServerName");
  LOGGER.debug("Class found" + c);
  Method m = c.getMethod("getFullName", new Class<?>[0]);
  LOGGER.debug("Method found" + m);
  Object o = m.invoke(DeliveryServiceUtils.class, new Object[0]);
  LOGGER.debug("Method invoked, response is " + o);
  processName = o.toString();
}
catch (Exception ex) {
  processName = "unknown - " + ex.getClass().getName() + ": " + ex.getMessage();
}
试试看{
Class c=Class.forName(“com.ibm.websphere.runtime.ServerName”);
调试(“发现类”+c);
方法m=c.getMethod(“getFullName”,新类[0]);
LOGGER.debug(“找到的方法”+m);
对象o=m.invoke(DeliveryServiceUtils.class,新对象[0]);
debug(“调用方法,响应为“+o”);
processName=o.toString();
}
捕获(例外情况除外){
processName=“未知-”+ex.getClass().getName()+”:“+ex.getMessage();
}

至少对于WebSphere来说,另一种选择是在JNDI树中查找它。 这就是我使用的:

InitialContext ic = new javax.naming.InitialContext();
String serverName = ic.lookup("servername").toString();
这样我就不必配置任何东西,因为WebSphere为我绑定了这些信息


还可以使用“thisNode/Cell/cellname”和“thisNode/nodename”检索单元格和节点名称。集群中有用的东西。

这让我省去了很多麻烦,因为我不想为每个webapp发送JVM参数+对不起,我很困惑,我想查一下nodename。“thisNode”是文字还是必须用节点的名称替换?如果是:从哪里获得节点的名称。这正是我需要的。工作起来很有魅力。