LoadRunner用JavaVuser做性能测试(写得不错)_第1页
LoadRunner用JavaVuser做性能测试(写得不错)_第2页
LoadRunner用JavaVuser做性能测试(写得不错)_第3页
LoadRunner用JavaVuser做性能测试(写得不错)_第4页
LoadRunner用JavaVuser做性能测试(写得不错)_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

众所周知 , Java 语言是 一 门非常适合网络开发的语言 , 用Java 语言进行性能测试脚本开发将会大大提高测试开发效率 。 Load Runner 中提供了对 Java 虚拟用户的支持 。 Java 虚拟用户依托于 JDK, 这大大扩充了 LoadRunner 的脚本开发功能。 测试人员既可以 用Java 虚拟用户来测试基于 Java 的应用系统的性能 , 又可以使用 Java 语言的强大开发脚本功能来测试其他平台的系统性能。 本主主将和读者 一 起探索 LoadRunner 的 Java 世界 , 重点讨论如何 开发Java 自定义的虚拟用户肤II本。 本主主主要内容如下: n 认识 Java 虚拟用户 n Java JJ却本开发基础 n Java 算法测试案例 7.1 认识Java 虚拟用户 7.1.1 Java 虚拟用户协议Java 虚拟用户脚本主要有 JavaVuser、Corba-Java 、RMI-Java、EJB 等类型 。 这些类型的虚拟用户脚本均可以用 Java语言来手工编写。 下 面将对各类 Java虚拟用户简单地进行介绍 。 Java Vuser Java Vuser 是自定义的 Java虚拟用户脚本, 脚本中可以使用标准 的Java语言。 这种虚拟用户不可以录制, 只能采用纯手工编写, 其 适用范围和 C Vuser 一 样, 非常广泛。 本章主要探讨Java Vuser 的开发方法。 Corba-Java Corba-Java 类型的虚拟用户主要用来测试用Java 编写的、 使用 Corba 应用程序或小程序的性能, 用户可以先运行 VuGen 录制的脚 本, 然后使用标准的 J ava 库函数以及 LoadRunner 特有的Java 方法 来增强该脚本。 RMI-Java RMI-Java 虚拟用户适用于测试 RMI C 远程方法调用) Java 应用 程序或小程序。 选择 RMI- Java 用户进行录制 , VuGen 可以创建对应 的 Java 脚本 。 完成录制后 , 可以使用 JDK 或自定义类 , 通过标准的 Java 代码来增强或修改脚本 , 还可以通过特定于 LoadRunner 的 Java 方法增强该脚本。 EJB 日B 虚拟用户专门用于测试 Enterprise Java Beans 对象。采用 EJB 协议 , VuGen 会自动创建脚本以测试 EJB 功能, 无需录制或编程, 这和标准的Java Vuser 明显不同。 在使用巴 B 协议类型的虚拟用户生成)阅本前 , 需要指定 JNDI 属 性和关于应用程序服务器的其他信息 。 LoadRunner 的日 B 检测器首 先扫描应用程序服务器并确定哪些 EJB 可用:接着选择耍测试的 EJB, LoadRunner 将生成要测试每个巳B 方法的脚本 , 并为每个方 活创建事务 , 便于度量其性能并找出问题。需要注意的是 , 创建巳B虚拟用户测试脚本必须在应用程序服务 器主机上安装 LoadRunner EJB 检测器 , 而且检测器必须处于活动状 态 。 EJB 检测器是 一 个独立的 代理程序 , 必须将其安装在要扫描查找 EJB 的每 一 台计算机上。 安装 EJB 检测器前, 计算机上还需要安装有 效的 JDK 环境。 本书中将以 Java Vuser 为例来讲解Java 虚拟用户的开发和使用 方法。 Corba-Java 、RMI-Java 、日B,Ja 臼da Vuser等类型的虚拟用户使 用方法司以参考 LoadRunner 的联机帮助手册, 但是其手工脚本的 开发方法与 Java Vuser 是 一 样 的 。 在 “ 新建虚拟用户 对话框中的 “ 自定义 ” 或 “ 全部协议 ” 类别 下选择 “ Java Vuser ” 即可创建空的 Java Vuser 脚本 , 如图 7-1 所示。 在自动生成的脚本中 , vuser_init、 vuser_end 部分没有任何内容, Actions 部分生成的脚本如图 7-2 所示。 对于Java 类型的虚拟用户 , 可以编辑Actions 类 , 而 init、 end 部分则不可以进行编辑。在 Actions类中 , 有三个方法 init、 action 和 end , 通常在 init 方法中编写初始化 代码 、 在 action 方法中编写业务流程 、 在 end 方法中编写诸如释放资 源之类的代码 。 . ., . 叩川、” J翌 , .!J :l“a,.flir.l lJlll :.lr:trll.Tl 阻四百 “明 r.衡阳由 I Jil!, E明摘帽 .刷缸1 .喃喃阳阶回帽帽, 萨Y町 1:2 帽 由 ; 电 1 ,阳” i I,睛”唰M ”曲 l .it 品嗣曲 盔圆圈 鄙忡刷刷帽 .O u.同阳”s.,咽嗣同 徨M曲同,院阳西 号附叫阳l 的$血呻 3 a 斟 , 工 J 品,.v,阑 剔鸭 ”叩唰w,g lo,qa饵”四、”面d蜘唰侃” . C王=i 因 7-1 选择Java Vuser 协议 i帽。 rt Irai . I r: 队 .hi ,c cl a 骂 Actior 唱 队b lie inl initO ( 吨turn 0: 民 .t,l,c int llCt ict10 retum 0: 民 .t,tcint 冒币 。 l return 0: I l唁叫 图 7-2 Java Vuser 自动生成的 Actions 部分Java Vuser 脚本中可以放置任何标准 Java 代码 , 这也是 Java 虚 拟用户的魅力所在 。 7.1.2 Java 虚拟用户适用范囤 Load Runner 完全支持 C 语言 , 原则上可以用 C 语言实现任何想 要录制的功能 。 但是C语 言 的特点决定了这样做是 不现实的: 是性 能测试脚本开发戚本非常高; 二是很多企业的测试人员开发基础不 好。因此, 性能测试开发多选用c 、 C、 Java 等面向对象语言 一一 因为这类语言既有成熟的集成开发工具 , 又有庞大的类库来支撑 , 测试脚本开发速度会更快。下 一 章将重点介绍如何用.NET 来开发性 能测试脚本 。 Java 虚拟用户适用范围非常广, 归纳起来主要有两大类: 一 类是 不太适合录制的业务功能点的性能测试 , 例如网页上H忧p文件的下 载过程 、 视频播放等: 另 类是基于 Java 语 言开发的应用系统的性 能测试, 这类应用更适合采用 Java 虚拟用户进行测试 。用 Java Vuser 实现无法录制的测试需求 这类测试需求往往关 、 注于 对服务器产生的压力 , 重点测试在 一 定 压力下服务榕的负载情况, 为评估、 部署 、 调优系统提供参考。 在这类 测试工作中 , Java 的 作用仅是 一 门语言 , 用于辅助测试人员完成测 试程序的开发。 在性能测试工作中, 不能录制的测试点很多 , 主要有以下几类: 含有控件的 Web 应用 在 Web 应用中 , 很多包含 些插件的浏览器应用经常不能录 制 。 这类应用往往涉及很多协议 , 因此录制起来不是特别方便。 对于 这类应用, 可以用 Java 语言调用其功能来完成用户行为的 模拟。 些和l媒体播放 、 文件下载等相关的应用 媒体播放或文件下载等过程的录制往往不容易控制, 如果是应用 基于P2P的协议, 则会更加复杂。因此, 这类测试只能由测试人员开 发虚拟用户脚本来完成。用 Java Vuser 测试基于 Java 语言的应用系统性能 相比前面, 基于Java 语言开发的应用系统 , 在性能测试中采用 Java 虚拟用户更显得 “ 门当户对 ” 。这类虚拟用户主要应用在下面两 类测试中: l核心算法或业务的执行效率 对银行 、 电信等大型的基于2匠的架构应用系统中 , 开发阶段的 性能测试是必不可少的 。 为了降低后期遇到性能问题的风险 , 往往在 开发阶段进行 一 些核心业务的性能测试。这些核 心业务或要求较高的 执行效率 , 或者要求支持较多用户的并发。 因此 , 可以利用 Java Vuser来测试这些业务的执行效率。 I Java 应用中不能录制的业务模块 很多时候 , 一 些J2EE 架构的业务系统用 LoadRunner 录制起来不 是特别方便 , 例如 一 些Java 智能客户端程序 。 这时可以手工编写测 试代间 , 完成测试任务 。 与非Java 应用相比, Java 应用中不能录制的业务功能更适合采用 Java 虚拟用户 , 因为 可以直接对 一 些方法进 行调用 。 由于Java 语言的强大功能 , Java 虚拟用户的应用远不止上面这 些 , 读者可以慢慢挖掘 。 7.1.3脚本开发环境配置 Java 虚拟用户需要Java 开发与运行环境的支持 , 因此首先 要安装 JDK。 JDK是 Java开发工具包的简称(Java Development Kit) , Sun 公司将 JDKl.2 以后的版本通称为 Java 2o JDK的另外 一 种叫法是 J2SDK (Java 2 Software Development Kit ), 现在比较常见的 J2SDK 是 1.4 以上的版本。 JDK 可以从 h忱。: 网站上下载 , 这里不再赘 述 。 下面简单介绍Java 虚拟用户开发与运行环境的配置 。 在本章 中, JDK 安装在 “ C:j2sd kl .4.1 路径下, LoadRunner 安装在“D:Program FilesMercury InteractiveMercury LoadRunner ” 目录下 , 系统调试环挠以 Windows XP 为例 。 第 步: 在桌面上右键点击 “ 我的电脑 ” , 进入到 “ 系统属 性 ” 设置界面 , 切换到 “ 高级 ” 边项卡 , 如图7-3所示 。 第二步: 点击图 7-3中的 “ 环境变量 F , 进入到环境变量配 置界面, 如图 7-4 月斤示 。 第三步: 在图7- 4 的 “ 系统变量 ” 中 , 选中 CLASSPATH , 点 击编辅, 如果没有 CLASSPATH, 则点击 “ 新建 ” , 同样会进入 图7-5所示的界面。 通常安装了 LoadRunner 等软件的系统会创建 CLASSPATH 变 量。 这里需要注意的是, 一定要在 CLASSPATH 变量 , 值的最前面 输入当前路径 “ . 和DK 的类库路径 , 例如 “ .;C:j2sdkl.4.1 lib; C:j2sdkl.4. 叫陀lib; , 否则将可能导致 Java 虚拟用户的运行错误 。例如:在图7-4中 , CLASSPAT变量值是 “.;C:j2sdk1.4.1 lib; C:j2sdk1.4.1 jrelib;D: Tomcat- 5.0commonlib; D:Program FilesMercury InteractiveMercury LoadRunner classes;D: Program Files Mercury InteractiveMercury LoadRunnerlib飞 重虞咀 A 也., 捶哩品里即“a 埋 置量晴叉,E就跑 . jzj,知IJ1lfU 章 童 璋嚣噩噩址盟酌情j , 内事植用 以且Ail血肉 !.! 晴P挝量Z ” JfU.11然翩且E遇 .811句盟国吨E 矗现且毡,:Id失巅调试擅S C!fil E豆豆豆二JC卫亟主旦 C!:“LJOD 图7-3系统属性界面I IF四置 也 ffil 1 置量 白描. r in唱P 量量哑, m 酣 W 偏 离黑月照 .蛐a Sti . ,CJ;,面 c、 ”民 w s,u,吨, CJ;,.S. lt茸茸量 喧 夏量 国. ,.s, . ”Jfl$J_ C . JYljf.罩Z m皿!.OfJ L 值 ;t : 飞且,dld 1、l JT”叫-6. C fflOOIS,y U 副 :m. 四 C li2sdk1 l I ,、 ,. . 曹 B豆己 C!:JC!二 图7-4环境变量设置 , i,.J 园区 “阳盘Z 1 量量Ql 圭量Ill. 0T幢刷 -li c 1m田 . 陆 c 、,2,11 .“. l,4 蝠,即: U 蝇旧” 氯口也 ,uur.i盟”酌骂 得? 俨 ., _, .川唰 “u . .:, r ,民揭梅奇刷毓 a.Ill 血簸,随bllQI) m m ,. 丽百丁 ” 图7-13文件基本配置信息 m:m:mm: , . t圃挝斟擂1-: 口 f 图7-14文件编精界面 在源代码编辑界面 , 输入测试语句 “System.out.println( ” HelloWord!可 H 如图7-14所示 。 代码编辑完成后 , 按照图7-15编译与运行程序。 如果编译执行成功, 可以在 Eclipse的控制台看到输出结果 , 如图7-16所示 。 h踵R恼。砸自ltl 争 O、 1运骨唱,窗口电J锦勘聊 , G i.l! ,. .IP, 霄咽 1111111 !l: l , . , , 1“ o 看好 , 睛, 凶, l llt ; u J 组Ji 帽夜(!). Ji. t JVN呻唰谅 自 IOlO JIY!,呼主 、 的Ji.i .Ill”、膏lat 画E .:c 1量由气 1 - 自 , 哥 j ,.,. s . , 恬 。r.un; 也瞌霄胃 :t trll v/“ uth 0 将民主 hy tow薯冒 撞在主F t1每!c.Hti 咂面巢军 百口 在虫” J,v, - ef-11rtM!J 凡 ll ll,刷刷 .) 、, 图7-15执行Java程序 1111_ . ? 些l堕 11(1 ,。唱 直冒 刷工凰QI) ()ff J 醋,立(t-!l OD . .:1 . u.- , ,.i .飞 宜” .S ia -vAlO Cl 码 .t ”J.l_t,Jn4. cl.n ”咐。 .J.惕,缸” .JC制” 响J Z曲” 且 h” 磊、:)a.-. a I.) tl” .3 也.!) tr bn 剿 c J 嚣 . ” V 一一 寸 1 .坷民帽 用IIQ S!j 阉“俑 .,.字节 ,球回扁 E v 曰”画 图7-16查看编译结果 l编译与运行Java程序编译后的class 文件可以在 “ D:LoadRunnerclassescomlrtest ” 下找到 , 如图 7-16 所示 。 需要注意的是 , 类文件的存放路径是根据 建立项目的设置来决定的 。 开发虚拟用户脚本 进入到 “ D:LoadRunnerclasses ” 目录下, 把整个 “ com ” 文件夹 复制到 “ C:j2sdk1.4.1 lib , 这样 LoadRunner 创建的所有Java Vuer脚本均可以直接调用;如果放到虚拟用户脚本的当前路径下 , 则只有当前的虚拟用户脚本可以调用。多台主机进行并发测试时 , 应 该把编译好的类文件放到对应的虚拟用户脚本目录下。根据图 7-1 和 图 7-2 所示新建一个 Java 虚拟用户脚l本 , 并对照图 7-17 , 输入同样 的测试脚本 , 尤其要在代间开始处输入包的导入语句 “ impo比 com.Ir.test.; ” 。i,晤。 r愈 lrapi lr, i111。r C OIi. lr. tut.* public cl.,aa Acti。na C publie int initO ( re turn O. 当 m public in 飞 a ct i。nO C Hell 。”or !. = i n ( Stri 吨。)nul 1); re urn O. public in 雹 end () ( re 飞 urn 0. 俨” 因 7-17 Java 虚拟用户示例脚本 运行虚拟用户脚本 点击 Vitual User Generator 工具栏上的 图标开始执行脚本 。 正确的执行结果如图7-18 所示 , 可以看到执行曰志中有 “System.out: HelloWord!飞如果运行不正确, 读者可以参照前面的 过程进行分析, 同时检查JDK的路径设置。 市,幽崎 崎 VirtuM U田r Script started sartir唱 i,ction V111町jnit. 岛、ding 时tion vu 辑r _lnl t. Runnir唱Vuscr . Stlllti,唱 action Actions Sy飞ou t: Hclloll/ON! ! !ndl吨8CIion Act ions. 叫in, Vuser. , . Stl!lting a,ction IIIScr _end. !ndi吨 oe1lon w=_cnd. Vu 目r Terminated图 7-18 正确执行的虚拟用户肚!本 与CVuser脚本相比, Java Vuser脚本是先编译再执行, 而C Vuser脚本是解释性 的。 VuGen在 JDK 安装路径内查找javac编译器, 并在脚本内编译Java 代码。 该阶段由VuGen窗口底部的 “ 正在编 译 ”状态消息来指示。 如果在编译期间出锚, 则这些错误将在执行 日志中列出。 测试脚本保存后, 接下来可以放到Controller中来运行, 读者可 以自己进行实验。需要注意的是, 如果进行多台计算机联机测试, 则 所有运行测试脚本的客户机必须安装JDK 环境并正确设置路径, 否 则将会出现如图 7-19 所示的提示 。 !工些 _:_Im些削。, 因 ;. ,- .毗御自., ,., . -. 叭。晴阳阳阳TH-m酬W幽唰嗣耐加阳” 革统统不噩lltt鹤立件 二1 图 7-19 JDK 环境不正确的提示要想正确使用 Java 虚拟用户, 首先要保证测试环境配置正确。 执 行测试时 , 可以先用本节的示例程序来检查环境是否正确 , 然后再 进行复杂功能的开发 。 7.2.2 LoadRunner的Java API Load Runner 为访问 Vuser 函数提供了特定的 Java API, 这些函 数都是 Ira pi.Ir 类的静态方法 。 借助 Java API 可以大大增强 Java 虚拟 用户脚本的可用性。 本节将介绍常用的 Java API 的用法 , 更多的函 数及其用法读者可以参考 LoadRunner 联机手册。 在Java 虚拟用户中 , Java API 函数的用法与 Vuser 函数中的用法 基本 一 致 , 只是写法稍稍不同, 更符合Java 语言的特点。 1. 事务函数(Transaction Functions) ( 1) int lr.stat _transaction( String transaction_name ):标记事 务开始: ( 2) int lr.end_transaction ( String transaction_name, int status ):标记事务结束。2.信息函数(Informational Functions) ( 1) String lr.get_group_name( ): 返回 Vuser组的名称; ( 2) String lr.get_host_name( ): 返回执行 Vuser脚本的负载 生成器的名称: ( 3) String lr.get_master _host_name ( ): 返回运行Controller 计算机的名称: (4) int I : get_scenario_id( ) : 返回当前方案的ID; 但) int lr.get_vuser_id( ):返回当前Vuser的ID 。 3. 运行时 函数(Run-Time Functions) ( 1) void lr.peek_events ( );: 指示可以暂停Vuser脚本的位置; ( 2) int Ir.rendezvous( String rendezvous_name ): 在Vuser脚 本中设置集合点; ( 3) void lr.think_time( double time ):暂停脚本执行, 模拟实 际用户操作之间的思考时间 。 4.字符串函数(Sting Functions) ( 1) String lr.eval_string ( String instring ): 用当前值替换参数:( 2) int lr.eval_int ( String name ): 用整型值替换参数; (3) int I仁next_row ( String dat_file ): 指示使用指定参数的下 一行数据 。 5. 消息函数 ( Message Functions) ( 1) int lr.debug_message( int message_level, String message ):向输出窗口发送测试过程的调试消息: (2) int lr.error_message ( String message): 向Vuser日志文 件和输出窗口发送错误消息以及位置的详细信息; ( 3) int lr.log_message ( String message ): 向Vuser 日志文件 发送消息: ( 4) int Ir.message ( String message ): 向输出窗口发送消息: ( 5) int lr.output_message ( String message ): 向日志文件和 输出窗口发送消息和位置信息; (6) int lr.vuser_status_message ( String message): 向 Controller窗口中的 “ Vuser状态 ” 区域发送消息 。7.3 Java 算法测试案例 本节将结合 个具体案例来讲解如何借助 Java Vuser来测试Java 程序的算法。 在案例中 , 主要模拟了测试某银行的信用卡审批过程 , 这部分内容是开发阶段性能测试的 一 部分。在这个测试例子中 , 主要 发现了在并发时的两个算法问题: 提交任务处理结果发生异常时 Socket没有正常关闭;申请任务方法 giveOutWork()没有加同步控 制关键字synchronized。 为了更好地演示测试效果 , 程序中忽略了实际程序中的 一 些细节 , 例如具体的任务申请以及处理过程 。 测试内容简介 信用卡审批程序主要包括两个部分 , 即客户端程序与服务器端程 序 。 客户端程序包含 一 个 Client. va 类文件 , 剧仅包含 一 个类 Client, 主要封装客户端的 “ 申请 一 处理 一 提交 ” 操作 。 服务器端程 序即 WorkServe仁java , 包含WorkQueue、 AcceptClientThread、 WorkServer 三类。 类 WorkQueue 主要完成任务队列的构建与管理工作;类 AcceptCIient Th read 继承 线程类 Thead , 以独立线程的方式来处理客户端申请任务并保存客 户端对任务的处理结果; 类 WorkServer 是服务器端的执行类 , 主要 完成对 WorkQueue、 AcceptClientThread 的调用。 下面具体介绍业务流程。 窑户端对 一 项任务的业务流程如下: 第 一 步: 与服务器建立连接 , 向服务器发出处理任务申请, 等待 服务器返回任务; 第二步:从服务器得到任务后, 开始进行处理; 第三步: 处理完毕后, 提交结果给服务器进行保存 , 然后等待服 务器返回结果; 第四步:输出服务器的保存结果; 第五步:结束当前的任务处理 。 客户端源程序清单:Clien. v a package com.loadrunner.test; import java.io.*; import .气 客户端申请任务 、 确认是否可以审批 、 处理 、 传递结果得到确认 * author ChenShaoying public class Client Socket socket; int clientNumber; Bu仔eredReader is ;读出服务器返回的输入流 PrintWriter os;反馈给服务器的输出流 向服务器申请任务 Client(Socket s) t 叩 this.socket = s; this.is = new BufferedReader(new Inpu巴treamReader(s .getlnpu巳tream(); this.as = new PrintWriter(s.getOutputStream(); this.clientNumber = lnteger.parselnt(is.readline(); catch (Exception e) System.err.p rintln( ” Error:Can not init the network ! ” ); public int applyWork() int WOkNumber=-1; t叩 请结果 this.os.println( ” Apply ” );发出申请 os. flush(); workNumber = Integer.parselnt(this. is.read Line();读出申if (wokNumber = -1) System.out.println ( ” Server has no Work to d。 ” ); System.exit( 1);退出程序 catch (Exception e ) System.err.println ( ” Error:Can not apply the network ! ” ); return wo kNumber; 处理任务: 添加实际处理过程即可, 本处略 * return deal with resL It * author ChenShaoying public int dealWithWork(int worknumber) System.out.println( ” dealWithWork:飞worknumber); return 1; 传递结果到服务器确认 * return ensure result * author ChenShaoying public boolean finishWork(int workNumber) boolean finish=false; t叩 this.os.println( ” finish ); os. flush(); finish = Boolean.valueOf(this.is.readline().booleanValue(); if (finish = false) System.out.println ( ” Error:Work finish can not be set! ” ); System.exit(!); catch (Exception e) System.err.println( ” Error:Can not sta忧 the network! ” ); System.exit(!); return finish; 服务器端对 一 项任务的业务流程如下: 第 一 步: 建立任务队列, 等待审批人员进行申请; 第二步: 服务器收到用户申请后, 系统会先锁定记录: 第三步: 修改当前记录状态, 并把当前任务返回给客户端; 第四步: 等待客户端审批人员返回处理结果:第五步:收到客户端提交的处理结果 后, 保存处理结果。 服务器端源代码清单:Wo kServer.java packag e com.loadrunner.test; import java.io.气 import .气 队列原始 N个任务, 接受申请返回任务号, 检查任务是否正在 处理、 接受审批任务确认 * author ChenShaoying cla 臼 WorkQueue private int WorkFlag;/0未申请;1申请后正在处理;2处理完成 private int total; int nowNumber; 创建任务队列:total 队列长度; Workflag 用来监控队列中每个 任务状态的数组; nowNumber 当前可以申请到的任务编号 WorkQueue(int totalNumber) this.total=totalNumber; this. Workflag=new int this.协tal; for(int i=O;ithis.total;i+) this. Workflagi=O; this.nowNumber= 1; 接受客户端申请, 把队列任务提供给当前申请的客户端 int giveOutWork() int k=this.nowNumber; this. WorkFlag this.nowNumber = 1; t叩 Th 陀ad.sleep(l );模拟服务器对任务的处理时间 catch (InterruptedException e) e.printStackTrace( ); this.nowNumber; return k; 如果当前任务的状态是正在处理 , 则修改其状态为完成井返回 true,否 则返回 fal 罚。boolean finishWork(int worknumber) int number=worknumber; if (this.Workflagnumber=l) this.Workflagnumber=2; return true; else System.err.println( ” Work飞number ” Can not be finished ” ); return false; 客户端连接对话线程接受任务申请返回任务号、接受审批任务确 认、 接受任

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论