Tuxedo应用开发_第1页
Tuxedo应用开发_第2页
Tuxedo应用开发_第3页
Tuxedo应用开发_第4页
Tuxedo应用开发_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、 软件工程师技能培训(初级)教材系列 Tuxedo应用开发Tuxedo应用开发培训教材2009年2月1Tuxedo简介31.1TUXEDO是什么?31.2C/S系统的层次结构31.3C/S模式的演化41.4基本C/S模式41.5可管理多层C/S模式51.6TUXEDO的C/S方案61.7TUXEDO系统的特点71.8一个例子81.9开发TUXEDO C/S系统的必要步骤112客户端开发122.1客户端在C/S模式中的作用122.2客户端开发过程122.3调试和错误处理132.4进程管理142.5数据缓冲管理152.6同步通讯162.7编译C语言客户端程序173服务端开发183.1服务的运行流程

2、183.2返回控制193.3初始化和结束服务203.4创建服务203.5规划服务的考虑214Tuxedo 域234.1第一步:UBBCONFIG应作相应改动234.2第二步:为域间请求创建DMCONFIG244.3第三步:创建DMCONFIG指定对域外提供的交易254.4第四步:设定环境变量254.5第五步:编译ubbconfig254.6第六步:编译dmconfig261 Tuxedo简介1.1 TUXEDO是什么?BEA TUXEDO是在企业、Internet 这样的分布式运算环境中开发和管理三层结构的客户/服务器型关键任务应用系统的强有力工具。它具备分布式事务处理和应用通信功能,并提供完

3、善的各种服务来建立、运行和管理关键任务应用系统。开发人员能够用它建立跨多个硬件平台、数据库和操作系统的可互操作的应用系统。BEA TUXEDO是企业、 Internet 分布式应用中的基础主干平台。它提供了一个开放的环境,支持各种各样的客 户、数据库、网络、遗留系统和通讯方式。特点:² 大量在线用户² 巨量数据² 信息访问² 小事务² 复杂网络1.2 C/S系统的层次结构以下列出了分布式系统的主要层次:² 用户界面:被分成表示管理和表示逻辑。代表有主机框架的3270仿真终端;UNIX系统的X终端等,最新的Web浏览器界面也是。

4、8; 商业逻辑:包含应用逻辑和应用规则。² 数据管理:分为数据访问逻辑(SQL)和数据库管理。区分C/S结构的类型可以根据以下特性:客户端和服务端程序间逻辑分布,如何实现层次功能;中间件产品及技术的使用。1.3 C/S模式的演化上图列举了不同种类的C/S模式。其中大型主机系统仍然统治着最大的OLTP应用;基于X终端和UNIX工作站的应用在80年代后期兴起;廉价的WINTEL机器支持的Windows GUI通常用于2层模式;数据库新技术和OSF带领了3层应用模式。1.4 基本C/S模式C/S系统是一种分布式系统,由其程序决定其特点:² 客户端部分执行前端功能,如:提供用户界面

5、,向后台发出用户请求的交易,将结果返回给用户。² 服务提供一般后端功能,按交易组织,将结果返回前端。² 交易是分散的,按需求的操作,可以被远程客户端访问的程序。C/S模式可能会有如下优点:² 减小客户端程序体积,提高反应速度² 位置无关² 模块化² 扩展性好1.5 可管理多层C/S模式在可管理多层(Managed Multi-Tier MMT)C/S模式中,提出了中间件管理。在本书范围内,此点由交易处理(Transaction Processing TP)管理完成,提供以下功能:² 在客户端和服务端之间进行通讯和传输

6、8; 提供良好的系统管理² 提供交易、配置的分布式管理它管理服务端从多个客户端收到的数据流,并不是在C/S间建立一对一的关系,而且客户端可以向多个服务发出请求。这种特点保证了TUXEDO可以提供强大的分布式交易处理框架。由于不必进行通讯和交易管理,数据库引擎可以专注于其特长:管理数据!在这种情况下,数据库成了一个纯RM(Resource Manager)。MMT C/S模式给OLTP应用增加了如下优点:² 所有C/S模式的优点在MMT模式下都得到了增强。实际上,由于中间件的引入,处理能力得到改善。² 由于中间件管理了数据流,带来了许多新功能,如:交易路由、服务分布

7、、管道、数据依赖路由等成为可能。² 统一的数据流控限制了最大交易数,总的数据库过程少了,服务器空闲时间也少了,这就增加了数据库和系统效率。² 应用代码的设计可以不考虑物理地址和内部数据表示。² 配置成了一件单纯的管理工作,进一步的,可以通过配置轻易的改变系统结构。服务可以动态的增加、删除和重启动。1.6 TUXEDO的C/S方案构成TUXEDO系统的各部分、工具和其特性组成的MMT C/S模式给应用带来的便利及TUXEDO的实现方法:MMT C/S模式的优点TUXEDO的实现技术模块化客户端,交易,服务最大化的处理能力和流量客户端交易流量控制,分布式配置,快速消息

8、匹配和路由通讯传输技术ATMI访问,一种简单且容易定义的接口实时应用管理核心配置文件,MIB,管理工具和基于浏览器界面的GAI名字服务和交易位置无关公告牌提供目录交易便利应用数据服务应用服务位置可以在配置中随意配置1.7 TUXEDO系统的特点² TUXEDO /Tn 管理C/S数据流n 支持3层结构n 多平台支持n 协同(BEA Connect, /TxRPC, /OSITP)n 开发u 通讯手段l 同步l 异步l 会话l 广播通知l 管道l 事件订阅u 缓冲数据类型(自动编、解码)u 事务n 管理u 核心配置管理u 管理信息库(MIB)u Web界面管理接口u 负载平衡u 网络配

9、置u 安全u 数据依赖路由u 数据压缩² BEA JOLT 将TUXEDO中间件框架扩展到Internet和Java客户端² TUXEDO /Qn 通讯保障n 预定处理² TUXEDO /WSn 多平台支持n 把BEA TUXEDO ATMI API扩展到客户应用程序中² TUXEDO /Domains² TUXEDO /COBOL1.8 一个例子一个TUXEDO 应用可以分成3部分² 发布交易请求的客户端² 运行响应请求交易的服务² 描述应用机器和服务信息的配置文件上图是本例的示意图:客户端请求交易“TOUPPE

10、R”,数据是“hello world”。交易“TOUPPER”将字符串转成大写,将结果成功返回客户端。客户端范例#include <stdio.h>#include “atmi.h”main()char*buf;longlen;if (tpinit(TPINIT * )NULL) = -1)exit(1);if (buf=tpalloc(“STRING”,NULL,80)=NULL)tpterm();exit(2);strcpy(buf, “hello world”);if ( tpcall(“TOUPPER”,buf,0,&buf,&len,0)= -1)fpri

11、ntf(stderr,”service requst failn”);tpfree(buf);tpterm();exit(3);printf(“return string is :%sn”,buf);tpfree(buf);tpterm();exit(0);包含TUXEDO系统的头文件”atmi.h”,以便引用TUXEDO的函数和变量定义。客户端调用tpinit()连接应用用tpalloc()分配一个STRING类型数据缓冲将”hello world”拷贝进缓冲用tpcall()包含数据缓冲,向交易“TOUPPER”发一个同步请求打印出改变的数据缓冲调用tpterm()切断与应用的连接交易范例

12、#include <stdio.h>#include <ctype.h>#include “atmi.h”void TOUPPER (TPSVCINFO *rqst)int i;for ( i=0;i<rqst->len-1;i+)rqst->datai = toupper(rqst->datai);tpreturn(TPSUCCESS,0,rqst->data,0L,0);包含TUXEDO系统头文件”atmi.h”象所有的TUXEDO交易函数一样,TOUPPER不用直接返回任何值,所以返回类型为void从客户端收到的数据放在TPSVCIN

13、FO结构中,是唯一的入参交易处理用tpreturn()将数据缓冲返回客户端配置文件有关应用的信息,如可用交易,交易位置,应用范围等,有必要集中管理于单一资源。事实上,这些信息被集中于文件UBBCONFIG。该文件分7节,主要部分内容描述如下:*RESOURCES节包含全局信息,如:标识公告牌位置的唯一键值(IPCKEY),主控节点的名字(MASTER),应用类型(MODEL),下文例子中设为SHM表示是一个单节点应用。*MACHINES节包含节点信息,如:机器物理名,TUXEDO系统位置(TUXDIR),服务码位置(APPDIR),以及本文件的二进制码文件名(TUXCONFIG)。*GROUP

14、S节包含一些管理用信息,如设定服务或交易的分布式事务处理。*SERVERS节包含需要启动的交易和其组信息等其他信息。*SERVICES节包含影响应用操作方式的的必要信息。本节列出的交易都是需要特别配置的,如有特别的优先级,装入参数,数据依赖路由等。配置文件范例#file : ubbconfig*RESOURCESIPCKEY5000MASTERSITE1MODELSHM*MACHINESgumbyLMID=SITE1TUXDIR=”/usr/tuxedo”APPDIR=”/usr/apps/simpapp”TUXCONFIG=”/usr/apps/simpapp/simpapp.tux”*GR

15、OUPSGROUP1LMID=SITE1GRPNO=1*SERVERSsimpservSRVGRP=GROUP1SRVID=1*SERVICESTOUPPER建立应用建立一个TUXEDO应用,必须进行以下步骤:² 设置环境变量。TUXDIR表示TUXEDO用户目录;TUXCONFIG是二进制配置文件名;在路径中加入TUXEDO的可执行文件路径;如果用到公共库,还必须包含LD_LIBRARY_PATH,指出公共库位置。TUXDIR=/usr/tuxedoPATH=$PATH:$TUXDIR/binTUXCONFIG=/usr/apps/simpapp/simpapp.tuxLD_LIB

16、RARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/libexport LD_LIBRARY_PATH PATH TUXDIR² 用buildclient命令从源程序编译出客户端可执行文件。buildclient f client.c o client -v² 用buildserver命令从源程序编译出服务端可执行文件。-s参数列出提供的交易。Buildserver f simpserv.c o simpserv s TOUPPER -v² 用tmloadcf命令从文本配置文件ubbconfig生成二进制配置文件tuxconfig。Tmloadc

17、f y ubbconfig1.9 开发TUXEDO C/S系统的必要步骤² 配置环境变量² 编码并编译客户端和服务端的程序² 由文本的ubbconfig生成二进制TUXCONFIG² 启动系统和服务² 测试应用² 关闭系统2 客户端开发2.1 客户端在C/S模式中的作用为了更好的了解客户端的所有任务以编写客户端应用,有必要重新认识客户端在C/S模式中扮演的角色。首先,客户端是用户界面。意思是当用户在系统上用程序进行一次操作的整个过程就是一个客户端过程。前端过程是对客户端的另一个描述。客户端的首要任务就是获得执行操作应该得到的数据。一旦

18、客户端得到了应有的信息,应该将数据按服务能够识别并适合传输的格式打包。然后,向服务端发送请求并等待回应。收到回应数据后,将其按一定格式返回给终端用户。2.2 客户端开发过程客户端程序的设计和实现可以被分成2部分考虑:² 用户处理过程² TUXEDO功能部分下文的客户端程序只描述了TUXEDO功能部分。利用TUXEDO的ATMI API调用可以做到:基本的TUXEDO调试技巧(tperrno,tpstrerror,userlog)TUXEDO进程管理(tpinit,tpterm)基本数据缓冲管理(tpalloc,tprealloc,tpfree)基本通讯(tpcall,tpa

19、call,tpgetrply)2.3 调试和错误处理当调用ATMI出错时,返回值为-1,全程变量tperrno被设值,该变量提供系统定义的出错原因。函数tpstrerror()以此变量为参数,返回错误的字符说明信息。完整的错误号和文本错误信息存在于文件$TUXDIR/include/atmi.h。函数userlog()重定向输出文件为ULOG.mmddyy。使用方法同printf()。该函数每次输出都写硬盘,这样在系统失败时也能保留调试信息。代码范例main()intret;ret = a ATMI callif ( ret = -1 ) printf(“Error in ATMI calln

20、”);usrlog(“ATMI error logged %d %s”,tperrno,tpstrerror(tperrno);elseprintf(“ATMI call OKn”);ret = tpterm();if ( ret = -1 )printf(“Error in exiting applicationn”);usrlog(“ATMI error logged %d %s”,tperrno,tpstrerror(tperrno);tperrno 全程变量(char *)tpstrerror(int)userlog() 语法同printf()ULOG.mmddyy 日志文件2.4 进

21、程管理为了使客户端能够访问TUXEDO交易,客户端程序必须连接TUXEDO应用并进行登记。这种管理性步骤在切断连接时也要类似执行一次。API如下:int tpinit(TPINIT *tpinfo)客户端通过调用tpinit()与应用连接,进行交互,有以下事件发生:调用安全接口检查客户端是否需要认证连接BB,使进一步的ATMI函数得到信息使BBL了解BB中已经存在请求建立客户端消息队列使服务可以发回返回信息,系统可以送出广播通知等错误时返回-1,可能由以下原因引起:² TPEINVAL参数错误² TPENOENTBB无空间² TPEPERM无连接权限²

22、TPEPROTO协议错误 被服务调用int tpterm()客户端调用tpterm()切断与应用的连接,结束了客户端的TUXEDO进程,该过程发生以下事件:BB入口删除,使BBL知道客户端已经离开客户端离开BB,客户端的信号量被移除客户端消息队列被移除错误时返回-1,可能由以下原因引起:TPEPROTO协议错误 被服务调用TPESYSTEM/T系统下错误TPEOS操作系统错范例main()int ret;ret=tpinit(TPINIT *)NULL);ret=tpterm();2.5 数据缓冲管理ATMI提供函数分配(tpalloc(),tprealloc())、释放(tpfree())T

23、UXEDO数据缓冲。应用负责将应用数据填入缓冲。应用的数据类型和组织决定应该选择何种数据缓冲。函数type()可以返回正在使用的数据缓冲类型。以下是TUXEDO基本的数据缓冲类型:² STRING以空值结尾的单域字符数据。² CARRAY有长度定义的单域二进制数据,不进行编、解码。² VIEW类C结构或COBOL记录的多域组织。² FML无固定结构的自定义缓冲。tpalloc(),tprealloc()在出错时返回空值,可能由以下原因引起:² TPEOS操作系统² TPEINVAL非法或不正确的类型² TPESYSTEMTU

24、XEDO之下的错误范例main()int ret;char *bufptr;ret = tpinit(TPINIT *)NULL);if ( ret = -1)printf(“Error in joining applicationn”);userlog(“tpinit error %d %s”,tperrno,tpstrerror(tperrno);elseprintf(“tpinit okn”);bufptr=tpalloc(“STRING”,NULL,1*1024);if ( bufptr=NULL)printf(“Error in allocating buffers n”);user

25、log(“tpinit error %d %s”,tperrno,tpstrerror(tperrno);tpterm();exit(-1);tpfree(bufptr);ret = tpterm();if ( ret = -1)printf(“Error in exiting applicationn”);userlog(“tpterm error %d %s”,tperrno,tpstrerror(tperrno);函数用法(char *)tpalloc(char *)type,(char *)subtype,long size)(char *)tprealloc(char *)bufpt

26、r,long newsize)void tpfree(char *)bufptr)2.6 同步通讯函数tpcall()有6个参数。如下:² 交易名² 请求数据缓冲² 请求数据缓冲的长度(仅缓冲类型为CARRY时需要)² 返回数据缓冲的地址。缓冲大小可以根据收到数据而改变。² 返回数据缓冲大小的地址² 标志量标志量可以是以下值:² TPNOTRAN如有交易不调用² TPNOBLOCK如有阻塞不等待² TPNOTIME愿意等待直到超时² TPSIGRSTRT系统中断信号在TUXEDO完成后再发布出错

27、返回-1,错误原因如下:² TPEINVAL参数错误² TPETRAN交易相关错误² TPETIME超时代码范例main()int ret;long len=0,flags=0;char *bufptr;if (tpinit(TPINIT * )NULL) = -1)exit(1);if (buf=tpalloc(“STRING”,NULL,801*1024=NULL)tpterm();exit(2);ret = tpcall(“TOUPPER”,bufptr,len,&bufptr,&len,flags);if (ret = -1)userlog

28、(“Error requesting %d %s”,tperrno,tpstrerror(tperrno);tpfree(bufptr);exit(-2);tpfree(bufptr);if(tpterm()= -1)userlog(“tpterm error %d %s”,tperrno,tpstrerror(tperrno);int tpcall(char *)servicename,(char *)bufptr,long length,(char *)bufptr,(long *)length,long flags)2.7 编译C语言客户端程序当C语言的客户端程序编码完后,需要连接正确的

29、库并编译。使用buildclient可以使该过程容易一点。该命令引用了C语言编译器并按正确的次序连接TUXEDO系统的库。为使用buildclient,应确认客户端程序包含了”atmi.h”,TUXDIR被设了正确的值。命令语法如下:buildclient -v o executable f first-file -f first-file -l last-file此处first-file表示的应该是编译器可以识别的文件。缺省的编译器是cc。一般是.c(c源程序),.C(C+源程序),.o(object)或.a(库)文件。参数解释如下:-o生成的可执行文件名-f需要在连接TUXEDO库之前传给

30、编译器的文件名。如有多于一个的文件名,名字应用空格分隔并用引号引起。也可以使用多个-f参数。-l需要在连接TUXEDO库之前传给编译器的文件名。语法同上。-v编译过程显示。3 服务端开发3.1 服务的运行流程为了更好的了解服务端的所有任务以编写服务端应用,有必要重新认识服务端在C/S模式中扮演的角色。首先,服务是系统资源的联系点。例如,一个数据库服务联系实际数据库并对其进行查询和修改。为有效进行,应建立一个数据库连接。其次,服务必须发布系统内可以访问的交易,保证客户端可以知道把请求发往何处。以上两步结束后,服务进入一个循环接收请求、处理请求并返回结果。接收请求包括进入消息队列,得到交易请求。处

31、理请求包括检查请求数据缓冲,运行商业规则和逻辑,可能还包括访问数据库和返回结果数据缓冲。当系统管理员需要关闭系统,可以通过系统管理工具将关闭系统的消息发给服务。服务完成所有交易,取消交易发布,关闭资源连接然后结束。3.2 返回控制在一般的C程序中,函数通过调用return()将控制返回,函数调用堆栈清空,控制返回调用点。TUXEDO系统的交易函数必须结束于将回应返回给客户端或前转到另一交易。函数tpreturn()用来结束交易将回应数据缓冲发给客户端。函数tpforward()将交易前转给另一个交易,由其负责回应原来的客户端。下图是tpreturn()的示意图。tpreturn()设计来代替常

32、规的return(),结束绝大多数函数。它将回应数据缓冲返回请求的客户端,控制权返回给服务程序的标准main()(由TUXEDO提供)。tpreturn()使用下列参数:第一个值表示交易是否成功,有3种可能:² TPSUCCESS交易完全成功,如果是一个会话,TPEV_SVCSUCC被生成² TPFAIL交易失败,tperrno将被设成TPESVCFAIL。如果是事务模式,事务被标志成abort-only,如果是会话,TPEV_SVCFAIL被生成。² TPEXIT与TPFAIL类似,但服务会中断,如果服务设成可以重启动,则可以由TUXEDO系统将其重启动。第二个

33、值是应用定义返回码,此处使交易可以发送一个整形代码到客户端,给出交易处理结果的详细信息。该值与/T系统无关,通过全程变量tpurcode送到客户端程序。第三个值是回应数据缓冲的的指针第四个值是回应数据缓冲的长度(仅缓冲类型为CARRY时需要)第五个值是标志位,通常不用3.3 初始化和结束服务tpsvrinit()和tpsvrdone()分别用来启动和关闭服务。如果应用不提供这两个函数,可以使用替代函数。tpsvrinit()用tpopen()缺省打开RM连接。tpsvrdone()用tpclose()关闭RM连接。tpsrvinit()象标准C语言的main()一样使用参数argc,argv。

34、服务的命令行参数可以传入该函数,被getopt()解析。该部分的用法参见应用配置部分。本函数出错时返回-1,成功返回0。tpsvrdone()无参数,无返回值。3.4 创建服务当C语言的交易程序编码完后,需要连接正确的库并编译。使用buildserver可以使该过程容易一点。该命令引用了C语言编译器并按正确的次序连接TUXEDO系统的库,连接TUXEDO生成的main()等。buildserver还用-s参数产生合适的交易名/函数名映射表。要使用buildserver,必须先正确设定环境变量TUXDIR,PATH,LD_LIBRARY_PATH。命令语法如下:buildserver -v o

35、executable -s service2,service3:func -f source/object -l object/library file例:buildserver s DEPOSIT o TLR f TLR.o f appinit.o参数解释如下:-o生成的可执行文件名-f需要在连接TUXEDO库之前传给编译器的文件名。如有多于一个的文件名,名字应用空格分隔并用引号引起。也可以使用多个-f参数。-l需要在连接TUXEDO库之前传给编译器的文件名。语法同上。-v编译过程显示。-b指定SHM或MP模式。如无此项,两种模式都包括;使用此项可以使生成的可执行文件小一点-r连接此处指出的

36、RM库。该RM的名字必须含在$TUXDIR/udataobj/RM文件中。3.5 规划服务的考虑在TUXEDO应用中,必要时服务可以仿客户端方式工作。例如:一个服务可能需要其他服务提供的交易,而建立一个副本并不太合理;当然,有时这样做会高效些。这种特性使程序员在多机配置应用逻辑可以改善编码和执行效率。关于这方面的例子,请参见TUXEDO提供的应用实例bankapp中的TRANSFER交易。一般是出于以下考虑,使用此种方式:² 最好不要使用收到的数据缓冲向其他服务请求,因为该缓冲可能被改变引起错误² 服务中的交易不应调用本服务中的交易,因为容易产生死锁(仅当设置TPNOREP

37、LY时可以)² 一个MSSQ集中的服务需要返回时,应有自己的返回队列;否则会与本集中其他服务冲突。数据缓冲管理数据缓冲管理大部分内容与客户端相同与请求数据缓冲不同,传给交易的数据缓冲可能已经被tpalloc(),tprealloc(),tpfree()函数处理过。因为传给交易的请求数据缓冲已经被tpalloc()分配,所以可以tprealloc()。所有在服务中分配的数据缓冲,在程序结束时必须全部释放;唯一例外是用在tpreturn()中的返回数据缓冲。如有剩余数据缓冲没有释放,会在每次交易调用时都生成一些,最终耗尽服务器内存。这可以很容易通过监视进程大小发现,它会随时间增长而加大。

38、仿客户端的方式下图展示的流程控制表示一个服务仿客户端方式工作。服务接收客户端请求,进一步向另一个交易进行请求。后者处理后返回前者,前者继续进行处理,准备回应数据缓冲,发回客户端。此结构不能超过2级!转发的方式下图展示的流程控制表示交易请求从客户端来到一个服务,转发到另一个服务,然后返回客户端。多个交易一个商业应用处理可能会需要来自不同数据源的相似信息或功能。例如下图,TUXEDO有多种方式实现:² 各交易功能分隔在独立的可执行服务中因为功能分布在不同的可执行服务中,编译如下:buildserver f read70.c o read70 s READ70buildserver f r

39、ead80.c o read80 s READ80buildserver f read90.c o read90 s READ90² 将不同功能组织在一个可执行服务中,分隔成不同交易服务程序包含3个交易函数,编译如下:buildserver f read.c o read s READ70 s READ80 s READ90² 合并各功能成一个交易,使用别名调用使用TUXEDO的别名功能,使交易以不同名字发布,如:buildserver f read.c o read s READ70,READ80,READ90:READREAD是真正的交易函数,但服务可以接受对READ7

40、0,READ80和READ90的请求4 Tuxedo 域4.1 第一步:UBBCONFIG应作相应改动为/DOMAIN建立的新组应该和其他应用组隔离开。其一用于管理,其他是网关服务。UBBCONFIG*RESOURCES IPCKEY49152 MAXACCESSERS2 MAXSERVERS25 MASTERSITE1 MODELSHM*MACHINES class2LMID=SITE1TUXDIR=”/usr/tuxedo” APPDIR=”/usr/apps/atmapp”TUXCONFIG=”/usr/apps/atmapp/atmapp.tux”*GROUPS LDMGRPLMID=SITE1GRPNO=20 LGWGRPLMID=SITE1GRPNO=30#下一行用于prod域 APP1LMID=SITE1 GRPNO=10*SERVERS DMADMSRVGRP=LDMGRPSRVID=200 GWADMSRVGRP=LGWGRPSRVID=310 GWTDOMAINSRVGRP=LGWGRPSRVID=320#下一行用于prod域 CUSTOMERCLOPT=”

温馨提示

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

评论

0/150

提交评论