15

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

谢谢

4

5 回答 5

18

至少对于 WebSphere 而言,另一种方法是在 JNDI 树中查找它。这就是我使用的:

InitialContext ic = new javax.naming.InitialContext();
String serverName = ic.lookup("servername").toString();

这样我就不必配置任何东西,因为 WebSphere 会为我绑定这些信息。

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

于 2013-10-03T12:49:50.943 回答
10

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

import com.ibm.websphere.runtime.ServerName;

System.out.println("Display name: " + ServerName.getDisplayName());
System.out.println("Full name: " + ServerName.getFullName());

样本输出就像

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

于 2012-05-17T12:33:12.057 回答
8

为了保持平台中立,您可以将变量设置为 Websphere 服务器的 JVM 参数(如果节点是集群的,则每个节点一个)。对于 Websphere 7,您将在 Admin Console 中找到以下内容...

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 来查询节点名称,但是随后您将代码输入到服务器,这使得单元测试变得困难并且不可移植。我更喜欢这种方法。

于 2012-05-16T13:23:59.647 回答
6

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();
}
于 2012-05-21T19:10:44.380 回答
4

布拉德建议的方法很好,但我会以不同的方式来做。

在 Server JVM 的自定义属性中,我将添加一个属性 Server-Name 并将其值指定为 WAS_SERVER_NAME。

这是面包屑:

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

添加一个新的服务器名称,其值为 ${WAS_SERVER_NAME}

每个 WAS 服务器实例都将此 WebSphere 变量设置为服务器实例的名称。您无需担心会出现拼写错误(或此处的类似错误),并且此方法适用于所有 WAS Server。

您可以创建一个将这些值设置为模板的服务器,当您创建一个新服务器时,这些值始终为您呈现。

高温高压

于 2012-05-17T03:56:13.230 回答