IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

增强 WebSphere eXtreme Scale 的 xsadmin

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

英文原文

英文原文


级别: 中级

John Pape, WebSphere Application Server SWAT 团队, IBM, Software Group

2009 年 5 月 26 日

Journal icon IBM® WebSphere® eXtreme Scale V6.1.0.3 包括名为 xsadmin 的工具,此工具是与 WebSphere eXtreme Scale 进程进行交互的 Java™ 应用程序,能显示关于网格运行时的信息,如网格单元放置、可用容器等等。本文将讨论如何增强 xsadmin,从而为您的 eXtreme Scale 部署提供新功能和更好的易用性。

来自 IBM WebSphere Developer Technical Journal

引言

IBM WebSphere eXtreme Scale 可以采用两种方式进行部署:

  • 通过扩充 WebSphere 配置文件安装到现有 WebSphere Application Server Network Deployment 实例中。
  • 安装到没有 WebSphere Application Server 的 J2SE™ 环境中。

在第一个场景中,系统监视和服务器管理任务由 WebSphere Application Server 的管理组件完成,但在独立环境和 WebSphere 管理的环境中,网格的内部视图都只通过 xsadmin 应用程序可见。

xsadmin 应用程序不是 WebSphere eXtreme Scale V6.1.0.3 产品代码的一部分,而是将其作为示例应用程序提供。几乎 xsadmin 提供的所有功能都可以通过与 eXtreme Scale 进程中包含的 JMX™ MBean 实例交互完成。

无需任何配置,就可以使用 xsadmin 查看当前网格单元(主单元和副本)在所配置容器中的放置,查看哪些容器可用,查看容器在哪个主机上运行。通过本文,您将能够:

  • 改写命令行参数代码,以支持必需参数和非必需参数的更为合理的逻辑流。
  • 公开用于方便地浏览可用网格实例和关联映射集的 -l 参数。
  • 添加并公开 -? 参数来补充现有的帮助参数 –h。
  • 添加 -catserv 参数,用于显示关于环境目录服务器的信息。
  • 添加 -cg 参数,用于仅显示关于当前核心组运行时状态以及定额状态和心跳间隔设置。

在开始对 xsadmin 进行更改前,了解一下其中已经包括的内容将很有帮助。





回页首


xsadmin 示例应用程序

本文假定您将使用 IBM Rational® Software Development 平台(具体来说,即 IBM Rational Application Developer V7.0.0.7)来更新示例应用程序。由于 xsadmin 应用程序是示例 Java 应用程序,因此可以使用自己选择的任何 IDE。不过,您必须能够包括 WebSphere eXtreme Scale V6.1.0.3 中的 objectgrid.jar 文件,此文件中包括必要的编译时类,需要将其放入构建路径中才能正确编译和测试该应用程序。有关如何将 objectgrid.jar 文件插入应用程序的构建路径的详细信息,请参见您的开发环境的文档。

xsadmin 应用程序由单个包组成,即 com.ibm.websphere.samples.objectgrid.admin。此包中有两个类文件,JMXProxy 和 OGAdmin。我们的工作重点将放在 OGAdmin 类上;我们将引用和使用 JMXProxy 类,但对于本文,您将不会处理源代码。

OGAdmin 类包含多个内部类:

  • Options
  • CmdLineParser
  • Comp

这里的重点是 Options 和 CmdLineParser 内部类以及其所属的 OGAdmin 类。

Options 类作为简单 Java Bean 存在,但没有 Java Bean 上典型的 getter 和 setter 方法。CmdLineParser 所进行的任务完全如其名称所述:它解析传递到 xsadmin 程序的命令行参数;更为具体来说,它解析传入到 OGAdmin 的 main() 方法的参数字符串。Options 和 CmdLineParser 类之间的“默认契约”规定,CmdLineParser 逻辑也必须知道在 Options 类上设置的所有可能的标志;之所以说这是“默认”的,是因为没有定义 Java 接口来确保此情况。

xsadmin 运行时:

  • 所有参数都传入 OGAdmin 类的 main() 方法。
  • main 方法然后会将参数解析委托给 CmdLineParser 对象,后者将返回 Options 对象。
  • 然后将计算此 Options 对象是否满足特定条件,此条件规定在 OGAdmin 类上运行哪个逻辑,以及由此决定的调用应用程序时控制台中的输出。
  • 当不使用选项进行调用时,工具通常会输出语法帮助的内容,以帮助您获得可能需要的网格运行时信息。

接下来,让我们了解一下如何增强此示例应用程序。





回页首


增强示例

  1. 要获得 xsadmin 应用程序的源代码,只需要将 WebSphere eXtreme Scale 安装的 OBJECTGRID_HOME\samples 目录中的 xsadmin.jar 文件移动到可以将此文件导入 IBM Rational Application Developer 工作区的位置即可。将文件放到新位置后,在 Rational Application Developer 中创建一个新 Java 项目,将其命名为 XSAdmin,然后在 Java 透视图的 Package Explorer 视图中右键单击 XSAdmin 项目,并选择 Import,以导入此文件。然后应该显示图 1 中所示的面板。

    图 1. 选择导入源
    图 1. 选择导入源

  2. 从导入列表中选择 Archive File 导入类型(或在树视图上面的筛选框中键入 Archive File),并单击 Next。应该显示图 2。

    图 2. 选择要导入的存档
    图 2. 选择要导入的存档

  3. 单击 From archive file 字段旁边的 Browse 按钮,并选择 xsadmin.jar 文件。(如果知道路径,也可以键入文件名。)图 2 显示 xsadmin.jar 文件路径为指向名为“alaric”的另一台 Windows® 计算机的 UNC 路径。另外,对话框左侧的树视图已展开,可以在其中看到存档的整个文件夹结构。在树视图中单击目录时,对话框右侧的列表视图将显示该目录中包含的文件。单击 Finish,以完成导入操作。
  4. 完成导入后,Package Explorer 视图应该如图 3 中所示。

    图 3. 导入成功完成
    图 3. 导入成功完成

现在已经将 xsadmin 示例代码导入到 Rational Application Developer 工作区中的新 Java 项目中,接下来就可以开始修改代码,以满足您的需求。





回页首


更改命令行要求

要更改的第一个项将是命令行参数解析。xsadmin 应用程序的编写始终要求必须提供 –g 和 –m 参数,分别代表网格名称和映射集名称。对此应用程序的大部分调用而言,这样的设置没有问题,但是正如稍后我们将讨论的,使用 –l 参数时不应该要求提供这些参数;-l 参数提供可用网格和关联映射集的清单,与浏览功能相当。那么,首先让我们处理这个问题。更改逻辑,从而将 –g 和 –m 参数修改为非必需参数,这个过程包括两个方面:

您必须修改 CmdLineParser 类中的逻辑,此逻辑包含在 parseArguments() 方法中。原始代码如清单 1 中所示。


清单 1. 修改前的 parseArguments()
				
if (options.gridName == null || options.mapsetName == null) {
     this.validate = false;
} else {
     this.validate = true;
}

为了有效地始终确保将验证标志设置为 true,您需要绕开此逻辑;在类的上部,此值初始化时使用的缺省值为 false。通过将清单 2 中的代码注释掉,可以确保验证标志始终为 false(也可以将其全部删除)。


清单 2. 修改后的 parseArguments()
				
/*
             * Removing these lines in this manner allows for the -g and -m arguments 
		 * to be bypassed, thus allowing bypassed, thus allowing a more logical
             * application of the -l argument like so : xsadmin -l -containers
             */
//            if (options.gridName == null || options.mapsetName == null) {
//                this.validate = false;
//            } else {
                this.validate = true;
//         }





回页首


公开网格/映射浏览参数

尽管 xsadmin 帮助中并未将 –l 选项明确作为可行选项进行说明,但提供了处理此选项的代码。在修改上述 parseArguments() 方法前,将无法有效使用此选项,除非为 –g 和 –m 参数提供虚拟值,即以下值除外:

xsadmin –ch myhost –p 1099 –l

必须以下面的格式运行:

xsadmin –ch myhost –p 1099 –g xxx –m xxx -l

.

为了有效地公开 –l 选项,您将需要采取一些操作:

  1. 更改 OGAdmin 类的 main() 方法中的逻辑,使其能接受仅仅提供 –l 参数的情况。
  2. 更改帮助内容,以包括新选项。

对于第一个步骤,让我们看一下 main() 方法的部分代码,如清单 3 中所示。


清单 3. main() method 代码片段
				
if (!(o.showContainers || o.showHosts || o.showPrimaries || o.showUnAssigned)) {
      CmdLineParser.printShowHelp();
      // System.exit(-1);
      return;
}

在未找到 –containers、-primaries、-unassigned 或 –hosts 选项的情况下,代码的这个部分将检查从命令行参数派生的选项并停止执行。由于您意在让用户仅仅指定 –l 参数,因此需要更改此代码,允许以这种方式使用 –l 参数。

清单 4. 显示了对 main() 方法的修改。在不调用 printHelp() 方法(负责告知用户如何使用 –containers、-primaries、-unassigned 或 –hosts 的代码)的现有 if 语句中添加了一个条件,即如果 Options 对象(本例中为“o”)上的 listOG 标志为“true”时。这正是所希望的行为。


清单 4. 修改后的 main() 代码片段
				
/*
* Added !o.listOG to account for the condition of a user wanting to just see the 
* list of grids and associated mapsets - who wants to specify the other options for 
* a listing????
*/
if (!(o.showContainers || o.showHosts || o.showPrimaries || o.showUnAssigned) 
	&& !o.listOG) {
   CmdLineParser.printShowHelp();
   // System.exit(-1);
   return;
}

在源代码中往下一点,将会看到负责输出网格名称和映射集的代码(清单 5)。


清单 5. 用于输出网格/映射集的逻辑
				
if (o.listOG) {
printListOfOG(jmxProxy.getObjectGridNames());
      return;
}

对此代码进行编译之后,应该就准备好运行示例测试了。要在 Rational Application Developer 中进行此工作,请在面板顶部的工具栏中单击 Run 图标,并选择 Run As => Java Application(图 4)。


图 4. 运行应用程序
图 4. 运行应用程序

在 Select Java Application 对话框(图 5)中,输入 OGAdmin,以指定将 main 类作为应用程序使用。选择类,并单击 OK 以继续。


图 5. 选择 OGAdmin 类作为 Java 应用程序
图 5. 选择 OGAdmin 类作为 Java 应用程序

由于没有指定命令行参数,应该在应用程序运行之后在控制台视图中显示帮助内容。所得到的结果应该与清单 6 中所示类似。

您将会注意到,帮助文本仍然没有变化,接下来让我们处理这个问题。在帮助文本中,您希望更改 CmdLineParser 类的 printHelp() 方法的原有内容。您只需要在相应的位置插入一行来说明 –l 参数及其使用模式即可。清单 6 显示了在 printHelp() 方法中插入代码行的区域所添加的代码行以粗体显示。


清单 6. 修改后的 printHelp() 方法
				
static void printHelp() {
            System.out.println("The following arguments are required:");
            System.out.println(" " + gridNameArg + " \'ObjectGrid name\'"); // 1
            System.out.println(" " + mapsetNameArg + " \'Mapset name'"); // 2
            System.out.println(OGAdmin.NL);
            System.out.println("The following arguments are optional");
            
            System.out.println(" " + listOGArg + " \'View a list of available grids 
		and associated mapsets\'");
            System.out.println(" " + jmxHostArg + " \'Catalog service JMX hostname, 
		default value=localhost\'"); // 1
            System.out.println(" " + jmxPortArg + " \'Catalog service JMX port. default: 
		1099 or 9809 for DMGR host\'"); // 2
            System.out.println(" " + dmgrArg + " \'Specify this flag, if connecting to 
		WebSphere DMGR host.\'"); // 14
            System.out.println(OGAdmin.NL);
            System.out.println("The following arguments are required if security is 
		enabled");
            System.out.println(" " + userArg + " \'Username\'");
            System.out.println(" " + passArg + " \'Password\'");// 1
            System.out.println(OGAdmin.NL);

            System.out.println("The following arguments are required if SSL is enabled");
            System.out.println(" " + sslArg + " \'Enables SSL authentication\'");
            System.out.println(" " + trustPathArg + " \'Absolute path to trust store\'");
            System.out.println(" " + trustPassArg + " \'Trust store password\'");
            System.out.println(" " + trustTypeArg + " \'Trust store type\'");
         System.out.println(OGAdmin.NL);

...
<code continues>
...

listOGArg 变量用于计算 –l 字符串。您现在已经通过添加帮助信息将 –l 参数完全公开,并允许在不提供其他必需参数的情况下在命令行提供此参数。

接下来,您将创建一些新功能:您将添加功能来允许用户查看集群化目录服务器信息。





回页首


添加功能:-catserv

xsadmin 示例应用程序已经提供了关于网格单元平台和服务器位置(即在哪个主机上运行)的信息,但并不提供关于目录服务器的状态和所在位置的任何细节。虽然必须至少知道一个目录服务器端点才能运行 xsadmin 工具(因为 JMX 接口在目录服务器中运行),但您可能不确定组成目录服务器集群的其他目录服务器的位置。接下来要将此功能添加到 xsadmin 示例应用程序中。

首先,您需要添加新标志,用于代表目录服务器选项的参数。在本例中,您将使用字符串值 -catserv。您将需要在 Options 和 CmdLineParser 类上创建此变量。

要将此变量添加到 Options 类,请直接添加此行:

boolean catServer;

将其置于类中已经定义的类级别变量的列表中(与 trustType、password、port 和 showContainers 类似)。然后,还需要在 CmdLineParser 类上定义一个类级别的变量,定义用于代表选项的实际字符串值。为此,您需要此行代码:

final static String catServer = "-catserv";

将其置于已经在 CmdLineParser 类中定义的字符串变量的列表中。现在已经在 CmdLineParser 和 Options 类中针对新参数进行了修改,接下来需要在 OGAdmin 类中提供相应的逻辑,以识别此参数并采取相应的操作。

我们在前面对 main() 方法中的逻辑进行了一些修改,以允许在不提供其他必需参数的情况下传递 –l 参数。您将需要再次采取类似的操作,以允许不提供其他必需参数的情况下传递新的 –catserv 参数。将要更改的代码所在的区域与清单 4 所示区域相同。清单 7 以粗体显示了新添加的代码。


清单 7. 新修改后的 main() 方法
				
/*
* Added !o.listOG to account for the condition of a user wanting to just see the 
* list of grids and associated mapsets - who wants to specify the other options 
* for a listing????
*/
if (!(o.showContainers || o.showHosts || o.showPrimaries || o.showUnAssigned) && 
	!o.listOG && !o.catServer) {
        CmdLineParser.printHelp();
        // System.exit(-1);
        return;
}

通过清单 7 中的更改,您现在可以在无需提供任何其他参数的情况下在命令行上传入 –catserv 参数。

接下来,您需要提供一些逻辑,以在此参数传入应用程序时采取相应的操作。清单 8 显示了您现在将要处理的 main() 方法(属于 OGAdmin)方法的区域。


清单 8. OGAdmin 的 main() 方法中的逻辑
				
/*
* code that responds to -l argument - prints out grids and mapsets defined!!
*/
if (o.listOG) {
    printListOfOG(jmxProxy.getObjectGridNames());
    return;
}

// Show containers
if (o.showContainers) {
    printContainers(jmxProxy, o);
} else if (o.showPrimaries) {
    printPrimaries(jmxProxy, o);
} else if (o.showUnAssigned) {
    printUnassigned(jmxProxy, o);
} else if (o.showHosts) {
    printHosts(jmxProxy, o);
} else {
    //?
}

清单 8 顶部的代码与清单 5 中所讨论的代码类似,提供了 –l 参数对应的功能。代码的下一部分确定是否向应用程序传递了 –containers、-primaries、-unassigned 或 –hosts 参数,然后将控制委托给相应的方法,以进行处理,即获取数据并设置相应格式,以便输出到控制台。您将要把 –catserv 参数对应的逻辑添加到紧靠清单 9 中所示的代码下。


清单 9. -catserv 参数检测的逻辑
				
//show catserver info
if (o.catServer){
printCatalogServers(catalogServerConnection);
}

请注意,您已经引用了名为 printCatalogServers() 的方法,此方法接受名为“catalogServerConnection”的变量。此方法尚不存在,因为您需要创建此方法。

创建这个新方法,并使用清单 10 中所示的源代码。变量 catalogServerConnection 在源代码中略微靠上的位置定义为 MBeanServerConnection 类型,用于通过使用 Java 5 SDK 中包括的 JMX API 来建立到目录服务器的 JMX 连接。您的 printCatalogServers() 方法将使用此连接对象获得关于环境中定义的目录服务器的信息。


清单 10. printCatalogServers() 方法
				
/*
* Prints all of the catalog servers known by the catalog server this tool is run against.
*/
private static void printCatalogServers(MBeanServerConnection catServerConn) {
	//make connection get ObjectGridServer info on catalog server
try {
	  Set<ObjectInstance> s = catServerConn.queryMBeans(new ObjectName
		("com.ibm.websphere.objectgrid:type=ObjectGridServer,*"), null);
	  Iterator<ObjectInstance> i = s.iterator();
	  System.out.println("Listing catalog servers known by this process:");
	  System.out.println("**********************************************");
	  while (i.hasNext()){
		DynamicServerMBean dsmb = (DynamicServerMBean)JMXProxy.getProxy
		   (catServerConn, i.next().getObjectName(), DynamicServerMBean.class);
		System.out.println("Catalog Server: " + dsmb.getServerName());
		System.out.println("Running on host: " + dsmb.getHostName() + "\n");
		}
		System.out.println("**********************************************");
	} catch (MalformedObjectNameException e) {
		e.printStackTrace();
	} catch (NullPointerException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

printCatalogServers() 方法使用此 JMX 连接在系统中查询 ObjectGridServer 类型的 Mbean。这种类型的 MBean 用于代表动态环境中的目录服务器和静态环境中的容器服务器(与 ObjectGrid 之前的版本不同)。一旦找到此 Mbean,代码会随后通过使用 xsadmin 示例应用程序中的 JMXProxy 类将 MBean 强制转换为代理对象。通过遍历从 JMX 查询返回的对象列表,代码将按名称输出恰当设置了格式的目录服务器列表,并包括所在主机的主机名。这里,可以通过包括多个其他方法的输出添加进一步的信息,这些输出通过 DynamicServerMBean 对象公开(此对象包含在构建路径中包括的 objectgrid.jar 文件中)。

这就是 –catserv 参数所需的工作!再次运行 xsadmin 应用程序,并确定未看到错误。输出应该与清单 11 中所示类似。请确保在应用程序的运行时定义中添加 –catserv 参数,如图 6 中所示。


清单 11. 成功使用 -catserv 参数
				
Connecting to Catalog service at alaric:1099
Listing catalog servers known by this process:
**********************************************
Catalog Server: cat1
Running on host: alaric.mshome.net

**********************************************


图 6 将 -catserv 参数添加到 Rational Application Developer 中
图 6 将 -catserv 参数添加到 Rational Application Developer 中

接下来,我们将处理最后一个功能:–cg 功能。





回页首


添加功能:-cg

您快要完成对 xsadmin 示例应用程序的增强了。对于最后一个增强,您将按照与上面相同的方式引入另一个功能。–cg 参数将用于为用户提供关于核心组当前的状态的信息(主导者和成员)。有时候,如果配置了区域,您将能够看到容器通过区域的分离,因为区域边界也是核心组的边界。此添加工作的大部分步骤将与前面一样,因此我们将跳过细节。

首先,向 Options 类添加新变量。例如,将其命名为 coreGroup 并使用此代码行在类上进行定义:

boolean coreGroup;

对于 CmdLineParser 类,请添加与之对应的以下代码行:

final static String coreGroups = "-cg";

有关详细说明,请参见添加功能:-catserv 部分。

向类添加了新变量后,请将处理程序代码添加到 OGAdmin 类的 main() 方法。您还将需要对清单 7 所示的代码进行一些小调整。新插入的代码在清单 12 中以粗体显示。


清单 12. 将 -cg 添加到独立参数列表中
				
if (!(o.showContainers || o.showHosts || o.showPrimaries || o.showUnAssigned) 
	&& !o.listOG && !o.catServer && !o.coreGroup) {
    CmdLineParser.printHelp();
    // System.exit(-1);
    return;
}

就像 catServer 变量一样,您可以在命令行中不提供任何其他必需参数的情况下指定 –cg 参数。

清单 13 中所示的代码块能检测 –cg 参数的存在,并将处理请求委托给相应的方法,在本例中此方法为 printCoreGroupInformation()。


清单 13. 检测 -cg 参数
				
//show core group info
if (o.coreGroup){
     	printCoreGroupInformation(jmxProxy);
}

printCoreGroupInformation() 方法与前面创建的 printCatalogServers() 方法略有不同。printCatalogServers() 方法需要传入 JMX 连接对象,以便查询服务器 Mbean。在 printCoreGroupInformation() 中,核心组信息由 jmxProxy 变量所代表的 PlacementServiceMBean 对象提供;应用程序 JMX 对象强制转换为 PlacementServiceMBean 实例。

您的最后一步是在应用程序中包括新 printCoreGroupInformation() 方法的代码。您可以使用清单 14 中所示的代码。


清单 14. printCoreGroupInformation() 方法
				
private static void printCoreGroupInformation(PlacementServiceMBean psmb) {
System.out.println("Printing core group information:");
System.out.println("**********************************************");
try {
StringBuffer xml = new StringBuffer();
	xml.append("<objectgrid>\n"); //added root element to make SAX parser happy
	xml.append(	psmb.getCoreGroups());
	xml.append("</objectgrid>\n"); // added root element to make SAX parser happy
      //System.out.println(xml);
	InputSource is = new InputSource(new StringReader(xml.toString()));
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	factory.setNamespaceAware(true); // never forget this!
	DocumentBuilder builder = factory.newDocumentBuilder();
	Document doc = builder.parse(is);
	XPath xPath = XPathFactory.newInstance().newXPath();
	//get the core group blocks
	NodeList nodes = (NodeList) xPath.evaluate("coreGroup", doc.getFirstChild(), 
		javax.xml.xpath.XPathConstants.NODESET);
	Node node = null; //a single core group block
	Node leaderNode = null;
	Node memberNode = null;
	for (int i=0;i<nodes.getLength(); i++){
		node = nodes.item(i);
		System.out.println("\nCore Group Name  : " + node.getAttributes().
			getNamedItem("name").getTextContent());
		//get listing for coreGroupLeader elements
		NodeList leaderNodes = (NodeList)xPath.evaluate("coreGroupLeader", node, 
			javax.xml.xpath.XPathConstants.NODESET);
		for (int j=0;j<leaderNodes.getLength();j++){
			leaderNode = leaderNodes.item(j);
			System.out.println("\tLeader: " + leaderNode.getAttributes().
				getNamedItem("serverName").getTextContent() + "(" +
leaderNode.getAttributes().getNamedItem("hostName").
	getTextContent() + ")");
		}
		//get listing for coreGroupMember elements
		NodeList memberNodes = (NodeList)xPath.evaluate("coreGroupMember", node, 
			javax.xml.xpath.XPathConstants.NODESET);
		for (int k=0;k<memberNodes.getLength();k++){
			memberNode = memberNodes.item(k);
System.out.println("\tMember: " + memberNode.getAttributes().
			getNamedItem("serverName").getTextContent() + "(" +
		memberNode.getAttributes().getNamedItem("hostName").
			getTextContent() + ")");
		}
				
	}
} catch (ParserConfigurationException e) {
	e.printStackTrace();
} catch (SAXException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
} catch (XPathExpressionException e) {
	e.printStackTrace();
}

int qStat = psmb.getQuorumActivationStatus();
System.out.println("----------------------------------------------");
switch (qStat){
   case 0:
	System.out.println("Quorum Activation Status:\n\tQuorum is disabled"); 
			break;
   case 1:
	System.out.println("Quorum Activation Status:\n\tQuorum is enabled:normal"); 
			break;
   case 2:
	System.out.println("Quorum Activation Status:\n\tQuorum is enabled:waiting 
			for quorum"); break;
   case 3:
	System.out.println("Quorum Activation Status:\n\tQuorum is overridden"); 
			break;
   case 4: 
	System.out.println("Quorum Activation Status:\n\tServer data may be 
			inconsistant"); break;
}
int hbfl = psmb.getHeartBeatFrequencyLevel();
switch (hbfl){
   case -1:
	System.out.println("Heartbeat Frequency Level:\n\tAgressive"); break;
   case 0:
	System.out.println("Heartbeat Frequency Level:\n\tTypical (default) "); 
			break;
   case 1:	
	System.out.println("Heartbeat Frequency Level:\n\tRelaxed "); break;
}
System.out.println("**********************************************");
}

printCoreGroupInformation() 方法是添加到应用程序中的最为复杂的方法。示例中的以粗体显示的第一行对 PlacementServiceMBean 实例调用 getCoreGroups() 方法。getCoreGroups() 方法将其信息作为采用 XML 格式的 String 对象返回。以粗体显示的第一行之后的代码处理 XML 字符串,使用 Java SAXParser 对象将 String 转换为能够搜索的 Document 对象。此代码还创建一个 XPath 对象,以方便对 Document 对象进行 XPath 查询。

以粗体显示的第二行和第三行监视定额服务和心跳频率级别的当前状态值。这两个代码块都会使用 switch 语句计算 int 值,从而得到输出到控制台的供人阅读的字符串值。

保存所有代码并运行应用程序之后(这次使用 –cg 参数),应该看到与清单 15 中所示类似的输出。


清单 15. -cg 参数的输出
				
Connecting to Catalog service at alaric:1099
Printing core group information:
**********************************************

Core Group Name  : Zone_AlphaCG0
	Leader: server1(alaric.mshome.net)

Core Group Name  : CoreGroup_0 CoreGroup_1
	Leader: cat1(alaric.mshome.net)

Core Group Name  : Zone_BravoCG0
	Leader: server2(alaric.mshome.net)
----------------------------------------------
Quorum Activation Status:
	Quorum is enabled:normal
Heartbeat Frequency Level:
	Typical (default) 
**********************************************





回页首


总结

通过对 xsadmin 示例应用程序的增强,您对如何使用 IBM WebSphere eXtreme Scale 的 JMX 接口进行了一定的了解。另外,您还对用于处理和解析应用程序中的命令行参数的基本机制进行了一些了解。完成这些增强的工作后,您应该已经非常熟悉相关技术,知道如何继续对示例应用程序进行自定义来满足自己的需求,或者甚至将应用程序“Web 化”并将其作为 J2EE® Web 应用程序提供!



参考资料



关于作者

John Pape 目前供职于 WebSphere SWAT 团队,并致力于为利用 WebSphere Application Server、WebSphere Portal Server 和 WebSphere Extended Deployment 的客户提供危急情况 (crit-sit) 支持。此角色需要关注细节并保持“标新立异”的创新思维,并始终确保 IBM 客户获得尽可能最好的支持!




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款