跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

基于多请求响应的远程软件安装服务

章 岩, 软件工程师, IBM
章岩,IBM 软件工程师,在 IBM CDL TaaS(Test as a Service) 部门从事多年软件自动化测试开发工作。主要关注领域软件测试自动化和云计算。目前基于云计算的测试服务平台 Testing Service Composer的Solution Architect。
朱 稳, 软件工程师, IBM
朱稳擅于 Web2.0、Dojo 开发,有丰富的 J2EE 开发经验,熟悉 REST 封装。
李 智, 软件工程师, IBM
李智,项目经理,在WebSphere Process Server产品开发和测试上有丰富的项目管理经验。

简介: 本文从一个简单常见的 IT 测试人员的需求入手,剖析在通过这种需求所反映出来的 IT 服务 – 远程软件安装服务。根据用户这一需求,本文主要描述这个服务的框架,并且详细阐述了对此框架的一种具体实现,主要包括前端 Web2.0 的实现机制,后台执行引擎的使用以及基于 REST 技术对服务的封装。

发布日期: 2011 年 6 月 07 日
级别: 中级
访问情况 : 3894 次浏览
评论: 


前言

服务存在于我们生活的各个角落,服务的种类多种多样。而借助互联网的推动力,基于网络的 IT 服务也越来越多,比如云计算带来的各种基础架构服务。本文中也要介绍一种基于网络的 IT 自助服务,一个基于多请求响应的远程软件安装服务。

提出用户需求

在我们的工作中生活中,电脑已经是不可或缺的一部分了,装在上面的玲琅满目的软件体现了我们工作和生活的多样性。然而安装一个软件通常需要一下几个步骤:

  • 搜寻安装文件 ( 搜寻位置,如公司服务器,公司网站或询问其他同事 )
  • 下载安装文件
  • 搜寻安装文档
  • 安装软件
  • 检查是否安装成功

图 1. 通常安装软件所需流程
图 1. 通常安装软件所需流程

在当前这样一个紧张的工作环境中,我们都希望用最简单便捷的方式解决问题。什么是简单便捷的方式呢?服务是首当其冲的。作为用户的我们只需要使用服务,其他问题都可以由服务提供方替我们解决。比如我们的电脑出问题的时候,IT 部门会上门或者通过网络帮我们解决。那么有没有一个服务可以帮我们把工作中需要的产品自动安装在我的机器上呢?

描述解决方案

基于上面这样一个用户场景,我们设计了一个可以承载多用户请求的远程安装服务。这个服务的目的就是能够帮助用户轻松自动的安装他们所需要的软件。我们提供了两种服务办法:

基于 GUI 的安装服务

这种方式顾名思义就是用户通过我们设计的 GUI 来使用我们的服务。用户可以在 GUI 上选择所需要安装的软件和安装需要的参数,并且提供需要安装软件的目标机器信息。然后服务会进行认证,安装等一系列操作。最后会在 GUI 上显示安装进度和信息,而且还会通过邮件通知用户。

基于 RESTful API 的安装服务

在这种方式中用户可以调用我们开放出来的 RESTful API 来使用安装服务。因为有些用户有自己的 GUI 来完成不同的业务流程,所以这种方式提供了 RESTful API 给需要连接到已经存在的客户系统中。

在服务的提供过程中,除了需要解决服务的开发发布的问题以外,我们还遇到了下面的问题 :

我们不是产品的专家,对于产品的安装谁能提供更加专业的帮助?

因为作为服务提供商的我们不可能对所有用户需要的产品都非常了解,所以在准备自动化安装脚本,制定产品公共安装参数等产品问题时就需要专业的技术支持。在这里我们也建立了一个稳定专业的合作模式。


图 2. 服务合作模式
图 2. 服务合作模式

在上面这个模式中存在以下几个角色:

  • 用户 (Customer) – 服务的使用者
  • 产品专家 (Product Expert) – 服务的使用者,同时更是特定产品的专家,负责提供产品安装的技术支持
  • 研发支持小组 (Support Team) – 服务开发所需要的特定软件的研发。这里特定软件指本文中提到执行引擎 IBM TPM(IBM Tivoli Provisioning Manager)。由于服务提供者可以使用不同的软件作为执行引擎,所以这个研发支持小组的技能需要也不尽相同。

在下面的章节中我们会先介绍实现服务框架时,我们用到的关键技术,然后会详细介绍框架的实现机制。


主要技术应用

REST 软件架构风格应用

REST(Representational State Transfer, 表述性状态转移)是一种轻量级的 Web Services 架构风格,可以说是为通过 HTTP 协议来进行分布式调用量身定制的。REST 提出了如下设计准则:

网络上的所有事物都被抽象为资源(resource);

每个资源对应一个唯一的资源标识符(resource identifier);

通过通用的连接器接口(generic connector interface)对资源进行操作;

对资源的各种操作不会改变资源标识符;

所有的操作都是无状态的(stateless)。

REST Web Services 的主要特征之一是以遵循 RFC 2616 定义的协议的方式显式使用 HTTP 方法,并且使用方式与协议定义一致。 这个基本 REST 设计原则建立了创建、读取、更新和删除操作与 HTTP 方法之间的一对一映射。例如,HTTP GET 被定义为数据产生方法,旨在由客户端应用程序用于检索资源以从 Web 服务器获取数据,或者执行某个查询并预期 Web 服务器将查找某一组匹配资源,然后使用该资源进行响应。

Dojo 简介

Dojo Toolkit 是一个强大的开源 JavaScript 用户界面开发工具包,可以使我们更容易、更快速地开发大型动态用户界面。 Dojo 1.2 以后的版本提供了对 REST 的支持。

使用 Dojo Toolkit 进行开发的优势除了它可以很好的对 REST 进行支持以外,还源于其强大的类库使 Web 2.0 的实现变的轻松、容易,而且 Dojo Toolkit 也很好的解决了 JavaScript 代码在不同浏览器之间兼容性不好,需要开发者对与不同浏览器编写不同代码的问题。

TPM 简介

TPM 全称 Tivoli Provisioning Manager。许多企业都面临着 IT 资源环境的复杂度的大规模增长的问题,公司被迫花费大量的人力物力在 IT 资源环境的管理,许多公司雇佣了大量人员专职负责这些任务:
1、维护企业准确的资源列表
2、各种终端的补丁维护
3、部署操作系统
4、解决未经许可的配置
而这些工作往往非常复杂,手动的操作常会带来不可预知的后果。TPM 提供了一个单独的集成解决方案来应对这些。其包含了一个详细的资源管理清单,OS 的部署,软件的安装和补丁的安装和管理。同时由于 TPM 建立在 SOA 的基础上。这些特性组合在一起,TPM 就能提供一个完全自动并且可定制的流程来替代原先需要人工解决的复杂流程,从而从根本上消除人为因素给系统带来的影响。


服务实现框架描述

框架总体结构

了解了关键的技术,我们首先简单介绍一下服务的实现框架的总体结构。


图 3. 服务实现框架总体结构
图 3. 服务实现框架总体结构

在上图所示的结构图中,右侧不同类型的使用者体现了服务的两种提供方式。左边的框图中分为 4 个部分:

  • 表现层 (Presentation Layer)

我们通过 Web 2.0 技术实现了我们 GUI, 其中分为以下几个步骤帮助用户完成服务的使用:

    • 第一步:用户选择需要安装的软件,其中包括软件的版本和对应的操作系统。
    • 第二步:用户阅读并同意服务安装协议。这里会提醒用户安装被选软件的一些注意事项,比如安装某些软件前需要提前安装 JVM。并且提醒用户,由于服务通过网络安装,所以需要用户注意保持网络的稳定。
    • 第三步:用户填写安装参数的信息。
    • 第四步:用户输入目标机器的信息,以保证在安装前的认证过程。目标机器的信息包括 IP 地址,用户名和密码。
    • 最后,用户提交服务请求。并且用户可以在页面上看到安装的进度和安装过程中每一步的状态。
  • 应用层 (Application Layer)

应用层提供主要的功能,比如软件的安装,安装前的验证和授权等。

    • 安装的功能主要由 TPM 工具和我们开发的 RESTful API 来完成
    • 安装前的验证和授权很重要,我们需要验证用户输入的信息是否正确,是否和他所选择的内容相符合,如果不相符合安装是不能进行的。作为服务提供方,考虑最关键的就是服务的可靠性。
  • 信息数据层 (Information Layer)

主要存储用户提交的请求信息和历史数据,方便用户查询提交过的请求,并方便服务提供方统计用户请求数据。

  • 共享库 (Repository)

这里以文件的形式存储了服务所需要的自动化脚本,其中还包括 TPM 的 workflow。

总体框架就描述到这里,下文会着重介绍在我们对上述框架的实现中的几个关键部分:

  1. TPM 的调用

    作为安装引擎的 TPM 在这里起着关键作用。但是安装引擎是可以替换为不同的产品或者开源工具的。本文只讲述在我们对框架的实现中是如何调用引擎的。

  2. Dojo 开发的 Web 页面整体服务的封装,为客户已经存在的系统作准备。

安装引擎 TPM 的调用

安装引擎 TPM 提供了多种调用接口,在此解决方案中,我们选用了 REST 封装的接口。其优点在于可以有效的使用 HTTP 协议,不需要再载入其他的项目或插件,只需要把 TPM 接口类和配置文件加入到项目中即可,而这个接口的实现不是由开发者实现,而是由 TPM 实现。

REST 调用 TPM

TPM 提供一个 REST 封装的接口类,在调用过程中,我们需要把该接口类加入到自己的项目中。而这个接口类可以使用 TPM 提供的 REST 接口,也可以由开发者本身自己编写代码以实现其接口。在本项目中,下面的类就是 REST 封装的接口:


图 4. 示意图
图 4. 示意图

接口类中提供了可供调用的 REST 接口:

搜索指定安装机器的接口:

 @RequestMapping(method = HttpMethod.POST, url = "/InitialDiscovery") 

校验安装环境系统版本的接口:

 @RequestMapping(method = HttpMethod.POST, url = "/CheckOSVersion") 

调用安装流程的接口:

 @RequestMapping(method = HttpMethod.POST, url = "/InstallMiddleware") 

根据用户调用实时返回调用状态的接口:

 @RequestMapping(method = HttpMethod.POST, url = "/GetStatus") 

与 TPM 的信息交互

使用上节列接口即可调用 TPM 实现其远程调用服务的主流程,前台收集了远程调用服务需要的设置参数后,同样通过 REST 调用将数据或者存入数据库或者传给 TPM,本节主要关注的是如何调用 TPM 提供的接口。

本文所介绍的服务以 Dojo Toolkit 实现的 Web 2.0 方式从页面获取用户数据进行 TPM 的调用安装。主要需要配合 Dojo Toolkit 中提供的 dojox.data.JsonRESTStore 类,以调用 TPM 提供的“校验安装环境系统版本的接口”为例:

1、首先是使用 Dojo 提供的 dojox.data.JsonRESTStore 类,该类需要指定一个 URL 以定位到对应的 REST 接口。


清单 1. 指定 URL
				 
 var OSVersionUrl = taas.utils.MPClient.getRequestUrl("/CheckOSVersion"); 

可以看到“CheckOSVersion”即是前面接口中对应的 url 参数。

2、初始化 dojox.data.JsonRESTStore


清单 2. 初始化 dojox.data.JsonRESTStore
				 
 this.OSVersionStore = new dojox.data.JsonRESTStore({target:OSVersionUrl, 
        idAttribute:"id", syncMode:true, contentType:"application/json"}); 
 var newOSVersionDataClass = this.OSVersionStore.getConstructor(); 
 this.newOSVersionDataObject = new newOSVersionDataClass(); 
 this.newOSVersionDataObject.IP = this.jsonConfirm.machineIP; 

dojox.data.JsonRESTStore 中的 target 属性为调用 REST 对应的 url,idAttribute 是数据对应的主键标识,syncMode 为设置是否要等待数据初始化完毕再继续执行,contentType 为数据的展现形式。

TPM 提供的校验系统版本的接口为 POST 方法的接口(REST 提供 POST、GET、DELETE、PUT 接口),POST 接口为向存储接口,可视为数据库中的 insert 操作。

后面的语句为初始化调用"CheckOSVersion"接口需要的数据,为用户根据接口自己定义的变量类型及数据。


清单 3. 定义数据
				 
 var newOSVersionDataClass = this.OSVersionStore.getConstructor(); 
 this.newOSVersionDataObject = new newOSVersionDataClass(); 
 this.newOSVersionDataObject.IP = this.jsonConfirm.machineIP; 

3、调用接口


清单 4. 调用接口
				 
 this.returnOSVersionStore = this.OSVersionStore.save({
     onComplete:this.saveOSVersionSuccess, onError:this.saveFailed, scope:this}); 

dojox.data.JsonRESTStore 的 save 方法会自动判断实例化的 dojox.data.JsonRESTStore 变量中的数据是否有改动或者变化(增、删、改都将视为数据改变)。如果有改变则调用 dojox.data.JsonRESTStore 中指定的 target 对应的 REST 接口的实现方法。onComplete 和 onError 是 save 方法中的两个可选参数,可以指定改次 save 操作在成功或者失败时进行的操作,改操作由用户自己定义。

下面列出上述所涉及代码的全貌:


清单 5. 代码全貌
				 
 checkOSVersion:function(machineSTP){
	var checkOSVersionResult = "
	<label style=\"background:#8DC6FD;font-size:16px;\">"+
	"The system is checking the OS version.Please wait for moments."+"<label>"+
	"<img style=\"width:50px;height:50px;margin-left:20px;vertical-align:middle;\" 
	src=\"../resources/taas/graphics/MPServicesContent/running.gif\"></img>";  
	if(!dojo.isString(this.jsonConfirm.machineIP)) {
		for(var i=0;i<machineSTP.length;i++) {
        if(machineSTP[i].contentWidget.getProgressStatus) {
			machineSTP[i].contentWidget.setStatus(checkOSVersionResult);
			} else {
				continue;
			}
		}
	} else if(dojo.isString(this.jsonConfirm.machineIP)) {
		machineSTP[0].contentWidget.setStatus(checkOSVersionResult);
	}
	var OSVersionUrl = taas.utils.MPClient.getRequestUrl("/CheckOSVersion");
	this.OSVersionStore = new dojox.data.JsonRESTStore({target:OSVersionUrl, 
	idAttribute:"id", syncMode:true, contentType:"application/json"});
	var newOSVersionDataClass = this.OSVersionStore.getConstructor();
	this.newOSVersionDataObject = new newOSVersionDataClass();
	this.newOSVersionDataObject.IP = this.jsonConfirm.machineIP;
	this.returnOSVersionStore = this.OSVersionStore.save({
	    onComplete:this.saveOSVersionSuccess, onError:this.saveFailed, scope:this});
}

其他安装引擎介绍

我们同样可以用其他的安装引擎,比如 Rational Build Forge,STAF/STAX,ITCAM 等。这里简单介绍一下 Rational Build Forge.Rational Build Forge ,它是专门用于构建和发布流程管理的软件。用户可以把已经编写好的脚本通过 RBF 进行组织和管理,做成工作流的形式。在 RBF 里面称作 step, 即步骤。不同步骤的组合可以封装成 library,并被其他 RBF 用户所共享。本文提出的服务框架中,RBF 也可以同样扮演执行引擎的角色,首先我们自己封装一个验证脚本,验证用户的机器信息正确性,然后通过 RBF 的 library 完成安装和安装验证的工作。

基于 Dojo 的 Web 展现

本文所用服务框架通过 Dojo 进行 Web 的展示,每个页面通过自定义的 Dojo Widget 展示。以远程调用服务在指定机器上安装指定软件为例,对于指定软件参数设置的信息收集页面的开发如下:


清单 6. 使用 Dojo 定义一个 widget 的 JavaScript 文件
				 
 dojo.provide("taas.ui.services.middlewareprovisioning.ThirdPage"); 
 dojo.require("dijit._Templated"); 
 dojo.require("dijit._Widget"); 
 dojo.require("taas.ui.core.Page");   
 dojo.require("taas.ui.services.middlewareprovisioning.ParameterContainerNotice");   
 dojo.declare("taas.ui.services.middlewareprovisioning.ThirdPage",
 [taas.ui.core.Page, dijit._Templated],{templatePath: dojo.moduleUrl(
 "taas.ui.services.middlewareprovisioning","templates/ThirdPage.html"), 

与该 widget 相对应的 html 页面可以在 templatePath 中设置,上面代码的含义即为在 taas/ui/services/middlewareprovisioning/templates 路径下的 ThirdPage.html 文件。其他相关逻辑并不是本文关注的重点故省略了。

而该 widget 关联的 HTML 代码如下:


清单 7. 使用 Dojo 定义一个 widget 的 HTML 文件
				 
 <div class="taas-core-MainDisplay"> 
    <div class="mptitle">${messages.title}</div> 
        <hr align="center" color="#E2E9F3"> 
        <br> 
    <table width="100%" style="text-align: left" border="0" 
    cellpadding="0" cellspacing="0"> 
        <tr> 
            <span colspan="3"><font 
            color="green"><em>${messages.tip}</em></font></span> 
        </tr> 
        <br><br> 
        <tr> 
            <div colspan="3" dojoAttachPoint="reg_parameters_listNode"></div> 
        </tr> 
        <tr > 
            <div colspan="3"> 
                <br> 
                <span>&nbsp;</span> 
                <button class="mpbackbutton" dojoType="dijit.form.Button" 
                type="button" dojoAttachEvent="onClick:doPrevious">Back</button> 
                <span>&nbsp;</span> 
                <button class="mpnextbutton" dojoType="dijit.form.Button" 
                type="button" dojoAttachEvent="onClick:doNext">Next</button> 
            </div> 
        </tr> 
     </table> 
 </div> 

需要注意的是,在 HTML 中,最外层必须有且仅有一对对应的标签,如上面代码中即为一对 div 标签。

整体服务封装

本框架所展示的服务可以封装为一个完整的 REST 服务或 Web Services 服务。

下面以封装为 REST 服务为例:

1、首先需要确定调用服务需要的参数,以本文所涉及到的实际项目为例需要的参数为被调用的机器 IP 及用户名、密码,需要在被调用机器上安装的软件相关参数,交互方式以 REST 封装,参数以 JSON 数据结果传输:


清单 8.JSON 数据结构
				 
 [{"name":"installLocation","value":
 "C:\\Program Files\\IBM\\WebSphere\\AppServer\\","label":"Install Destination Path:"}, 
 {"name":"PROF_adminUserName","value":"wasadmin","label":"WebSphere Instance Username:"}, 
 {"name":"PROF_adminPassword","value":"password","label":"WebShpere Instance Password:"}] 

各参数会和 TPM 服务中保存的默认参数进行对比,如果相同或没有改参数,则不修改默认参数的值,如果不同,则使用用户提供的参数替换默认参数值。

2、安装返回的参数为 REST 调用的结果,同样使用 JSON 方式进行数据传输:


清单 9. 响应数据的 Json 数据结构
				 
 {"status":"in-progress","action":"InitialDiscovery","detailInfo":""} 

上面返回的数据为 TPM 返回的 JSON 数据结构,经过 REST 服务封装之后只需要调用下面代码所对应的 url 即可获得安装结果。


清单 10.REST 调用的 URL 标识
				 
 @RequestMapping(url = "/mwinfosubmitresult/{id}", method = HttpMethod.GET) 


现状与展望

应用实例及现状

目前我们和一些产品小组合作,开发了不同软件的安装服务,比如 WebSphere Application Server, DB2 等等。为虚拟机和物理机的用户提供服务,而且我们也对服务安装的效率做了统计,供读者参考,根据 diagram1 中所描述的软件安装流程,我们分别统计了原始安装、基于物理机的安装和基于虚拟机的安装的耗费时间:


表 1. 使用服务前后软件安装时间消耗对比表
搜索安装文件 10 – 15 分钟

平均 17 分钟


平均 8 分钟
下载安装文件 10 – 20 分钟
搜索安装向导 5 – 10 分钟
安装软件 15 – 20 分钟
验证安装 5 – 10 分钟
总体消耗 45 – 75 分钟 15 – 20 分钟 5 – 10 分钟

展望

在未来我们希望能够通过以下几个方面来丰富我们的服务:

  • 添加支持的软件
  • 并行在多台机器上安装
  • 更加友好的界面

希望我们的服务能够为用户营造更加轻松的工作氛围,也希望这次文章可以给大家一些启发,能够涌现更多地 IT 服务。


参考资料

学习

  • REST,Web 服务,REST-ful 服务”(developerWorks,2011 年 3 月):基于 REST 的 Web 服务日益成为后端企业服务集成的首选,因为它比 SOAP 更加简单。这篇文章介绍了一个简单的可扩展框架,将 Java 业务服务作为类 REST 服务。它详细描述了设计细节,并探讨了各种可扩展性方法。

  • 用 Java 技术创建 RESTful Web 服务”(developerWorks,2010 年 6 月):JAX-RS (JSR-311) 是一种 Java API,可使 Java Restful 服务的开发变得迅速而轻松。这个 API 提供了一种基于注释的模型来描述分布式资源。注释被用来提供资源的位置、资源的表示和可移植的(pluggable)数据绑定架构。在本文中,学习如何使用 JAX-RS 在 Java EE 环境内实现 RESTful 服务架构的潜能。

  • REST 与 Web 开发”(developerWorks,2009 年 9 月):本专题为您收集了和 REST 开发相关的一些内容,其中包括 REST 的入门内容、如何使用 REST 风格的服务增强 Web 2.0 程序的可用性等,让您可以深入地了解 REST 风格 Web 服务的优势以及使用技巧和最佳实践。

  • 用 Java 技术创建 RESTful Web 服务”(developerWorks,2010 年 6 月):JAX-RS (JSR-311) 是一种 Java API,可使 Java Restful 服务的开发变得迅速而轻松。这个 API 提供了一种基于注释的模型来描述分布式资源。注释被用来提供资源的位置、资源的表示和可移植的(pluggable)数据绑定架构。在本文中,学习如何使用 JAX-RS 在 Java EE 环境内实现 RESTful 服务架构的潜能。

  • developerWorks 技术活动网络广播:随时关注 developerWorks 技术活动和网络广播。

  • developerWorks Java 技术专区:这里有数百篇关于 Java 编程各个方面的文章。

讨论

  • 加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。

作者简介

章岩,IBM 软件工程师,在 IBM CDL TaaS(Test as a Service) 部门从事多年软件自动化测试开发工作。主要关注领域软件测试自动化和云计算。目前基于云计算的测试服务平台 Testing Service Composer的Solution Architect。

朱稳擅于 Web2.0、Dojo 开发,有丰富的 J2EE 开发经验,熟悉 REST 封装。

李智,项目经理,在WebSphere Process Server产品开发和测试上有丰富的项目管理经验。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology
ArticleID=678510
ArticleTitle=基于多请求响应的远程软件安装服务
publish-date=06072011
author1-email=cdlyanz@cn.ibm.com
author1-email-cc=
author2-email=zhuwenbj@cn.ibm.com
author2-email-cc=
author3-email=lilzhi@cn.ibm.com
author3-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。