级别: 中级 王 颖初, 软件工程师, IBM
2009 年 10 月 23 日 Rational Clearcase 是一套功能全面的软件配置管理(Software Configuration Management,SCM)解决方案。但是 ClearCase 的系统安装与运行维护管理非常复杂,很多系统运行相关的功能、状态监控任务以及 UCM 项目状态查询操作都需要通过系统管理员在服务器端执行复杂的基于命令行的 ClearCase 指令。这一过程非常复杂繁琐,也无法供 ClearCase 普通用户使用。 本系列文章共有两篇,以一个实际生产环境中使用的 ClearCase 监控系统的开发为例,向读者介绍如何使用基于 Java 语言的 Web2.0 和 Web Service 技术来开发一个 Linux 环境下的 ClearCase 监控和 UCM 项目查询系统。本文是该系列的第一部分,将向您演示如何使用 Java 语言和 Web2.0 技术开发一个基于 Web 浏览器的 ClearCase 系统运行和状态监控程序。
Rational ClearCase 系统运行和状态监控程序应用场景介绍
Rational ClearCase(以下简称 ClearCase)是一套建立在服务器 - 客户机体系结构之上的软件系统。为了使用 ClearCase 的版本控制服务,终端用户需要使用各种 ClearCase 客户端(CCRC,CC Web 和 CC Native Client 等)来访问服务器主机。这些客户端只提供了访问处理 ClearCase 中存储的源代码数据所需的各种功能,并没有提供监控 ClearCase 服务器运行状态所需功能。这些服务器运行状态信息只能由 ClearCase 系统的管理员在服务器主机上通过使用 cleartool 或操作系统命令来得到。但是在软件项目的开发过程和 ClearCase 系统的日常维护中,项目中的各个成员都需要了解某些 ClearCase 主机的运行状态信息。例如 ClearCase 系统管理员需要监控 ALDB、DB、VOB 等服务的运行状态,软件项目的开发者和项目经理可能需要了解 view 服务器运行状态和系统运行时许可证分配状态等信息。
在常规的方式下,为了获得这些服务器主机状态信息,ClearCase 管理员需要连接到服务器主机并执行相应的命令行语句,或者编写相应的 shell 命令脚本并执行。而软件项目的开发者和项目经理等不具有 ClearCase 命令语句使用环境和技能的项目成员则只能求助于系统管理员来获得所需信息。根据软件开发团队的不同地理和行政组织结构,这一过程有可能非常的缓慢低效,同时会给 ClearCase 系统管理员带来非常大的工作量。
而在使用本文所述的基于 Web 浏览器的 ClearCase 系统运行和状态监控程序时,项目团队中的各个成员只需要打开任意的 Web 浏览器并输入本监控程序的 Http 地址即可在浏览器窗口中获得所需的各类系统运行信息。这些信息具有良好的组织结构和图形化的表现形式,便于各类使用者了解。同时可以消除 ClearCase 系统管理员的大量重复性劳动。图 1 是使用这两种方式的流程对比。
图 1. 常规方式和使用 Rational ClearCase 系统状态监控程序方式的流程对比
图 2 是一个真实运行的 ClearCase 监控系统的截图。在本文的以下部分首先会介绍一些在 ClearCase 中经常使用的系统运行和状态监控指令 , 之后将介绍如何使用 Java 和 Web2.0 技术来开发一个类似图 2 所示的通过 Web 浏览器实时远程执行这些 ClearCase 命令行指令并将运行结果显示在浏览器中的状态监控程序。
图 2. 真实 Rational ClearCase 监控系统界面
使用服务器端命令行指令进行 ClearCase 系统监控
ClearCase 是一个分布式的应用软件 , 它的大多数的操作涉及到服务器主机和运行在这些主机上的一些操作系统进程,清单 1 显示了一个真实运行在 Linux 平台上的 ClearCase 主机中的一些主要进程。
清单 1. ClearCase 的主要进程
[root@ccServer ~]# pstree -la
......
├─albd_server
│├─admin_server -S13:18,tcp
│├─db_server -S13:18,tcp
│├─db_server -S13:18,tcp
│├─db_server -S13:18,tcp
│├─syncmgr_server syncmgr_server -S13:17,tcp
│├─view_server /local/views/IRM_Admin_DODv3_DEV.vws -u
d75f1a85.b14a11dd.869c.00:09:6b:09:9b:5c -S13:18,udp:19,tcp
│├─vob_server /vob_storage/irm/irm_doc.vbs -S13:17,udp
│├─vob_server /vob_storage/irm/irm_pvob.vbs -S13:17,udp
│├─vob_server /vob_storage/irm/irm_src.vbs -S13:17,udp
│└─vobrpc_server /vob_storage/irm/irm_src.vbs -S13:18,tcp
...... |
在配置了 VOBs 和 Views 本地支持的 ClearCase 主机上,不论是否有 VOB 或者 View 已被创建, albd_server 和 admin_server 两个服务器进程均会运行。其他的服务进程将根据管理 VOBs 和 Views 的需要而启动长驻在主机上,各个进程的主要功能如下:
-
albd_server:当启动 ClearCase 时 albe_Server 首先被启动 , 它在需要的时候启动和停止其他的 ClearCase 服务。当停止 ClearCase 时 albd_Server 服务停止所有在主机上的其他的服务,然后退出。
-
admin_server:完成各种 ClearCase 管理支持功能。
-
view_server:一个常驻进程,管理着 View 服务器上指定的活动 View。
-
vob_server:对于每个 VOB,一个常驻的 vob_server 的进程运行在 VOB 的服务器上。它操纵存储在 VOB’s 存储池中的数据并响应客户端进程的请求。
-
db_server:管理 VOB 数据库事务并响应客户端程序发送的请求。
-
vobrpc_server:操作并响应来自网络的 view_server 进程的请求。
为了确认服务器中 ClearCase 服务是否在正常运行,可以使用命令 : ps -ef | grep albd_server 检查 albd_server 进程的运行状态 , 以下为一个正常运行的输出结果 :
清单 2. 检查 albd_server 进程运行状态
[root@ccServer ~]# ps -ef | grep albd_server
root 3199 1 0 Apr16 ? 00:00:53 /opt/rational/ClearCase/etc/albd_server
root 28718 27822 0 17:46 pts/2 00:00:00 /usr/bin/ksh -c ps -ef | grep albd_server
root 28721 28718 0 17:46 pts/2 00:00:00 grep albd_serve |
为了确认 VOB 服务是否正常运行 , 可以使用命令 : ps -ef | grep vob_server 检查 vob_server 进程的运行状态 , 以下为一个正常运行的输出结果 :
清单 3. 检查 vob_server 进程运行状态
[root@ccServer ~]# ps -ef | grep vob_server
ccadmin 4996 3199 0 Apr16 ? 00:00:00 vob_server /vob_storage/irm/irm_pvob.vbs -S12:16,udp
ccadmin 6377 3199 0 Apr16 ? 00:00:25 vob_server /vob_storage/irm/irm_src.vbs -S12:16,udp
ccadmin 6405 3199 0 Apr16 ? 00:00:01 vob_server /vob_storage/irm/irm_doc.vbs -S12:16,udp
root 28728 27822 0 17:46 pts/2 00:00:00 /usr/bin/ksh -c ps -ef | grep vob_server
root 28732 28728 0 17:46 pts/2 00:00:00 grep vob_server |
ClearCase 中还内置了一个称为 cleartool(/usr/atria/bin/cleartool) 的命令行工具 , 它包含有很多的子命令可以用来进行系统监控 , 以下是其中常用的一些 :
-
/usr/atria/bin/cleartool -version : 显示 ClearCase 系统的版本信息。
-
/usr/atria/bin/cleartool hostinfo -l : 显示 ClearCase 主机信息 ( 包括注册表 , 许可证服务器 , 操作系统等信息 )。
-
/usr/atria/bin/cleartool lsclients -host `hostname` -type license : 显示连接该主机的所有客户端信息。
-
/usr/atria/bin/cleartool lsvob -long : 显示该主机中的所有 VOB 的详细信息。
-
/usr/atria/bin/cleartool lsview -long : 显示该主机中的所有 View 的详细信息。
-
/usr/atria/bin/cleartool getlog albd : 显示该主机中的 ClearCase 主服务的日志信息。
除了 cleartool 外 ,ClearCase 中还包含其他的一些服务器端命令行工具 , 例如 clearlicense(/opt/rational/ClearCase/bin/clearlicense) 命令可以用来显示 ClearCase 主机中的许可证信息和实时使用状况。
使用 Java 和 Web 2.0 技术开发 ClearCase 状态监控程序
本文所述 ClearCase 状态监控程序是一个运行在 ClearCase 服务器主机中的轻量级的 Web 程序 , 它有一个使用 JSP+Servlet 编写的 Web 用户界面和一个用来执行 ClearCase 状态监控指令的操作系统进程调用组件。用户在 Web 用户界面中调用 javascript 方法来运行监控指令。通过 Web2.0 技术 ,javascript 方法被直接映射为操作系统进程调用组件中的 Java 方法 , 这些 Java 方法使用操作系统进程执行上文已经介绍过的 ClearCase 服务器端命令 , 并直接将命令执行结果返回 Web 用户界面中。图 3 是本文所述 ClearCase 状态监控程序的基本结构。
图 3. Rational ClearCase 状态监控系统基本结构图
本监控程序逻辑上由操作系统进程调用组件,Web 用户界面程序和 JSP/Servlet 容器三部分组成 , 以下是各个部分的功能和使用技术介绍 :
操作系统进程调用组件 :
监控系统中执行的所有系统命令行指令都会通过操作系统进程调用组件来执行 , 该组件由 Java 语言编写 . 由位于 com.cn.ibm.csdl.ecm.build.nerveCell.util.nativeCommand 包中的以下四个类组成:
-
NativeCommand 类:通过调用 java.lang.Runtime.getRuntime().exec(String cmdarray[]) 来产生一个操作系统进程对象 java.lang.Process, 并在这个进程对象中执行操作系统命令行指令并将指令执行结果以 CommandExeResult 对象的形式返回给调用者。
-
CommandExeResult 类:操作系统进程命令执行结果的 Java 对象表示,包含命令运行返回数据,异常数据,return code 和命令执行结果状态等信息。
-
OS 类:储存供不同操作系统使用的进程调用所需信息。
-
RemoteCommandUtil 类:组件工具类,提供方法将 CommandExeResult 对象中的信息转换为可以在 HTML 中显示的字符串形式的数据。
详细代码请参考本文附件中的 eclipse 项目工程。
Web 用户界面程序 :
Web 用户界面程序是状态监控系统的用户操作界面 , 使用 JSP+Servlet 编写 , 它的主要功能是执行 Web 页面中定义的 ClearCase 状态监控 javascript 方法 , 这些 javascript 方法调用会被转化为服务器端相对应的 Java 方法调用。当 Java 方法执行完毕后 , 方法的返回结果会通过 javascript 回调函数显示在 Web 页面上。Web 用户界面程序中使用 DWR 来耦合浏览器端的 javascript 代码和服务器端的 Java 代码。这一方法极大的减少了程序开发的难度和所需时间。
DWR 是一套开源的 Web2.0 类库 , 它包含服务器端 Java 库、一个 DWR Servlet 和一套 JavaScript 库。对于需要发布到浏览器中的每个 Java 类,DWR 首先会使用部署在 Web 应用程序中的 DWR Servlet 动态地生成包含在 Web 页面中的 javaScript( 这些 javaScript 包含存根函数,代表 Java 类上的对应方法并在后台执行 XMLHttpRequest 操作 )。之后 DWR 会把浏览器端的 javascript 用户请求转化成对服务器端的 Java 对象的方法调用 , 并把方法的返回值放置在 Servlet 响应中发送回浏览器客户端。
DWR 的配置十分简单 , 首先需要在 Web 程序的 web.xml 中定义如下的 servlet 和 servlet mapping 配置 :
清单 4. 在 web.xml 中配置 DWR servlet
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</display-name>
<description>Direct Web Remoter Servlet</description>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping> |
之后需要在 DWR 的配置文件 dwr.xml( 该文件和 web.xml 相同 , 位于 WEB-INF 目录中 ) 中定义需要转化的 Java 类和相对应的 javascript 对象名称 , 以下 dwr.xml 示例文件中将一个名为 com.cn.ibm.csdl.ecm.build.nerveCell.util.nativeCommand.RemoteCommandUtil 的 Java 类映射为一个名称为 RemoteCommandUtil 的 javascript 对象。
清单 5. 在 dwr.xml 中配置 Java 和 javascript 映射
<dwr>
<allow>
<create creator="none" javascript="RemoteCommandUtil">
<param name="class" value="com.cn.ibm.csdl.ecm.build.nerveCell.util.
nativeCommand.RemoteCommandUtil"/>
</create>
</allow>
</dwr> |
当 DWR 的服务器端配置完成后 , 就可以在 Web 页面中通过 javascript 来直接调用服务器端的 Java 方法。以下的代码示例通过 javascript 对象 RemoteCommandUtil 调用了服务器端的 Java 对象的 executeSingleRemoteCommand(String commond) 方法 , 并将返回结果传递到了 javascript 回调函数 displayGeneratedDate() 中。
清单 6. 调用 DWR javascript
<script type='text/javascript'
src='<%=request.getContextPath()%>/dwr/engine.js'></script>
<script type='text/javascript'
src='<%=request.getContextPath()%>/dwr/util.js'></script>
<script type='text/javascript'
src='<%=request.getContextPath()%>/dwr/interface/RemoteCommandUtil.js'>
</script>
<script type="text/javascript">
function displayGeneratedDate(str){
alert(str);
}
RemoteCommandUtil.executeSingleRemoteCommand("date",displayGeneratedDate);
</script> |
如图 4 所示,本文所述的 Web 用户界面程序中使用 DWR 将操作系统进程调用组件中的 Java 类 RemoteCommandUtil 绑定在 javascript 对象 RemoteCommandUtil 上。通过在 Jsp 页面中执行 javascript 方法来远程运行 ClearCase 服务器端状态监控指令。
图 4. Web 用户界面程序 javascript /Java 方法调用映射
DWR.png
以下的代码片断通过 javascript 对象 RemoteCommandUtil 直接执行了远程主机中的操作系统命令“ ps -ef | grep albd_server ”,并将命令执行结果实时的返回给 javascript 回调函数 displayClearCaseALBDSERVERStatus(str)。displayClearCaseALBDSERVERStatus 函数会使用适当的 javascript 方法将这一执行结果显示在 Jsp 页面中。
清单 7. 调用 ClearCase 监控指令
<script type="text/javascript">
function displayClearCaseALBDSERVERStatus(str){
//javascript program logic to display albd_service status on web page
}
RemoteCommandUtil.executeSingleRemoteCommandForHTML(
"<%=monitorServerName%>","ps -ef | grep albd_server",displayClearCaseALBDSERVERStatus);
</script> |
通过使用这一方法,我们可以在 Web 用户界面程序的 Jsp 中运行任意的 ClearCase 状态监控指令并实时将结果显示在页面中。
JSP/Servlet 容器 :
监控系统的 Web 用户界面程序使用 JSP+javascript+DWR 编写 , 为此需要提供一个 JSP/Servlet 容器来做为它的运行环境。本系统使用 Jetty 做为这一环境。Jetty 以 jar 包的形式发布它的系统操作 API, 通过调用这些 API, 开发人员可以轻易的将 Jetty 容器实例化成一个 Java 对象,从而可以简便的为一些独立运行(stand-alone)的 Java 程序提供轻量级的 JSP/Servlet 支持。清单 8 中的 Java 代码示例 , 在地址 http://hostname:9990/ccmonitor 上提供了对目录”./ccmonitorWebApp”中的 web 程序的 JSP/Servlet 服务支持,(ccmonitorWebApp 目录中储存了本文所示的 Web 用户界面程序)。
清单 8. 使用 Jetty 为 Web 用户界面程序提供 JSP/Servlet 服务支持
public void StartServer(){
int server_HTTP_Port=Integer.parseInt("9990");
org.mortbay.jetty.Server server =
new org.mortbay.jetty.Server(server_HTTP_Port);
String webappPath = "./ccmonitorWebApp";
String contextPath = "/ccmonitor";
org.mortbay.jetty.webapp.WebAppContext webapp =
new org.mortbay.jetty.webapp.WebAppContext(webappPath, contextPath);
org.mortbay.jetty.handler.HandlerList hl =
new org.mortbay.jetty.handler.HandlerList();
hl.setHandlers(new org.mortbay.jetty.Handler[]{webapp});
server.setHandler(hl);
try {
server.start();
} catch (Exception e) {
e.printStackTrace();
}
} |
当执行了方法 StartServer() 后 , 我们就可以在浏览器中通过访问地址 http://hostname:9990/ccmonitor 来使用本文所开发的 ClearCase 系统运行和状态监控程序,这一系统使用的 Jsp 和 javascript 请参考本文附件中的 eclipse 项目工程。
结束语
本文介绍了如何使用 Java 和 Web2.0 技术来开发一个 ClearCase 系统运行和状态监控程序。通过使用该监控程序 , 可以极大的减少 ClearCase 系统管理员的日常维护工作量。同时本文所介绍的方法也可以为 ClearCase 系统的管理维护和应用方式提供一个新的思路。
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | 王颖初,就职于 IBM 中国软件开发中心(CSDL),他是 IBM 认证的 UNIX 平台 Rational ClearCase 管理员和 SUN 认证的 SCJP Java 程序员。SCWCD Web 组件开发员以及 SCDJWS Web 服务开发员,目前在 CSDL ECM ECMWidgets Team 从事使用 Java 技术的 Web 软件开发工作。 |
对本文的评价
|