tuxedo负载均衡和多域测试附件
BEA中间件Tuxedo介绍

Page 10
WebLogic Platform
BEA WebLogic Workshop IDE
BEA WebLogic Portal Liquid Data BEA WebLogic Integration
Portal Foundation
Services
Interaction Intelligent
应用 Tux
EXEC SQL select * from..
业务逻辑
在服务
应用 Tux
数据库 器应用 服务器 种的
SQL
数据访问
基于服务的应用是无连接的
客户 端应 用种 的
SQL
EXEC SQL select from..;
应用
表达服务
SQL 连接
NN
事务
NN
断开连接 NN
业务逻辑
数据库 服务器
数据访问
Page 8
BEA技术类合作伙伴
Administration & Management Integration
Security Development &
Deployment
Portal
hp OpenView
Page 9
BEA @ China
80%+省本地网计费系统、客服系统、中国电信VNET 北京电信EAI、苏州电信EAI、北方9省网上营业厅 甘肃、重庆、福建(泉州)、深圳新97系统
Tuxedo在世界级企业 关键性系统的应用
150 million transactions daily to deliver 3 million packages
10,000 transactions per second to transact over $1 trillion annually
TUXEDO性能调优的基本方法

TUXEDO性能调优的基本方法一. 通过配置MSSQ服务器组提高性能在ATMI环境中(TUXEDO-CORBA服务器环境不支持MSSQ机制)可以通过配置MSSQ(多服务器单队列)机制来达到队列级负载均衡的目的。
同一组MSSQ服务器在同一时间将共用一个请求队列,当消息出队时,将被送到第一个空闲的服务器去处理。
如果服务器A属于某个MSSQ的一部分,那么必须为它配置响应队列,即设置REPLYQ=Y,这样当A调用了B服务时,B对A的响应将被回送到发出原始请求的服务器A,而不是MSSQ服务器组中的其它服务器。
MSSQ机制可以配置成动态形式,这样TUXEDO系统会根据负载状况动态地产生和消除MSSQ中的服务器。
在下列情况下,可以考虑配置MSSQ:应该配置MSSQ 不应该配置MSSQ服务器数量在2到12个之间 如果有多个服务器,折衷的办法是使用多个MSSQ请求缓冲区不是很大,没有大到将一个队列占满的情况 一个请求缓冲区可能会占满整个服务器队列空间。
所有的服务器都提供一组相同的服务 每个服务都提供不同的服务需要配置多个服务器进程才能满足客户机对服务器的实时性的要求。
每个MSSQ的服务器数量一般不要超过10个,如果超过10个,建议配置多个MSSQ。
在下面两种情况下,使用MSSQ将达到调优的效果:A.银行业务中,多个TELLER执行相同的服务来为客户提供服务,下一个空闲的TELLER将为下一个等候的客户服务。
在这种情况下,每个TELLER必须能够执行所有的客户服务。
在同一个MSSQ中的服务器必须在任何时候都提供相同的服务。
MSSQ的优点在于,它在队列级提供了第二种形式有的负载均衡。
B.在超市收款业务中,不同的CASHIERS接收不同形式的客户支付(如信用卡,现金等),在这种情况下,不推荐使用MSSQ。
例如:simpserv SRVGRP=GROUP1 SRVID=10 MIN=3 MAX=5RQADDR=simpserv REPLYQ=Y这个配置将启动3个simpserv进程,SVRID依次为10,11,12。
TUXEDO配置参数详解

TUXEDO配置参数详解2007-07-10 09:39:47大中小TUXEDO应用系统的配置3.1 TUXEDO应用系统的常见配置配置文件UBBCONFIG介绍一个TUXEDO应用系统的所有资源都在一个文本文件中进行定义,该文件称为UBBCONFIG,在配置完成后,UBBCONFIG被编译成一个二进制的文件TUXCONFIG.在TUXEDO系统启动时,从该文件中读取系统的配置信息。
UBBCONFIG文件类似WINDOWS下的*.INI文件。
它包括以下9大部分, 我们称之为节,RESOURCES,MACHIENS,GROUPS这三个节必须的,其他的节是可选的。
RESOURCES(必需): 与整个系统有关的配置信息MACHINES(必需): 一个TUXEDO应用系统可以跨越多台服务器,在该节中配置与每台服务器有关的信息GROUPS(必需): TUXEDO中的服务可被分为多个组,在该节中配置与组有关的信息SERVERS(可选): 与SERVER有关的信息在该节配置SERVICES(可选): 与SERVICES有关的信息在该节配置NETWORK(可选):与网络有关的信息在该节配置ROUTING(可选) :路由规则在该节配置NETGROUPS(可选):与网络分组有关的信息在该节配置名称解释:TUXEDO应用系统一个TUXEDO应用系统包括服务端,客户端,服务端安装在服务器上,客户端一般安装在PC 机上,从开发角度看,一个TUXEDO应用系统包括服务端程序,客户端程序,一个配置文件。
此外,一个TUXEDO应用系统可以部署在一台服务器上,也可以部署在多台服务器上。
SERVER:服务端程序用C或COBAL编写,每一个程序文件编译成一个相应可执行文件,该可执行文件在运行时称为SERVER,它实际上就是一个进程。
每个SERVER都有一个名字,也就是该进程的名字。
为与TUXEDO应用系统的服务端区分,我们在本书中,我们用SERVER表示该进程,用服务端表示TUXEDO应用系统的服务端。
tuxedo应用

*GROUPS
*GROUPS "LDMGRP" LMID="SITE1" GRPNO=20 TMSCOUNT=3 //组名,所属主机,组号,TMS个数(事 务监控) "LGWGRP01" LMID="SITE1" GRPNO=101 TMSCOUNT=3 "TRAN0" LMID="SITE1" GRPNO=50 TMSCOUNT=3 "THR990" LMID="SITE1" GRPNO=92 TMSCOUNT=3 "MUTIPAGE_GROUP" LMID="SITE1" GRPNO=100 TMSCOUNT=3 "RMS_GROUP" LMID="SITE1" GRPNO=200 TMSCOUNT=3 "POS_CTL_GRP" LMID="SITE1" GRPNO=300 TMSCOUNT=3
详解命令行参数
-A 表示server启动时,自动在BB中登记所包含的services。 -t 低版本的客户端连高版本的server端 -n 接入点为 HOST/IP:PORT, 与客户端WSNADDR环境变量相同。 -m 表示这个JSL fork出最少的JSH个数(初始值) -M 表示这个JSL fork出最多的JSH个数 -x 表示每个JSH同时处理多少各client的连接。 (请求队列的长度) -T 表示client端连上server连接后, 如果30秒没有交易请求,自动关闭连接。 -H 使用防火墙的外网地址。 -p -P 防火墙接入点所用的端口号范围。 (客户端WSNADDR要与外网地址一样)
2024版Tuxedo教程全解

Tuxedo教程全解contents •Tuxedo概述•Tuxedo核心组件•Tuxedo应用开发•Tuxedo系统部署与配置•Tuxedo性能优化与监控•Tuxedo实战案例解析目录Tuxedo概述Tuxedo定义与特点Tuxedo是一种中间件Tuxedo的特点Tuxedo应用领域金融行业电信行业其他行业Tuxedo发展历程Tuxedo的起源Tuxedo的发展Tuxedo 的未来Tuxedo核心组件ATMI编程接口支持多种编程语言,如提供了事务管理、通信、安全等方面的功能。
Tuxedo服务器123Tuxedo客户端010203Tuxedo管理工具Tuxedo应用开发开发环境搭建安装Tuxedo系统配置环境变量选择开发工具建立项目工程设计服务接口编写服务代码配置服务属性编译和部署服务服务开发流程根据业务需求设计客户端界面,包括输入、输出显示等。
设计客户端界面编写客户端代码配置客户端属性编译和部署客户端使用Tuxedo 提供的API 编写客户端代码,实现与服务端的交互。
在配置文件中配置客户端相关属性,如连接的服务地址、端口等。
使用Tuxedo 提供的编译工具将客户端代码编译成可执行文件,并部署到用户环境中。
客户端开发流程日志调试通过查看Tuxedo系统日志和应用程序日志定位问题原因。
跟踪调试使用Tuxedo提供的跟踪工具对服务调用进行跟踪调试,查看调用过程和结果。
单元测试针对每个服务或函数编写单元测试代码进行测试验证功能正确性。
集成测试将所有服务集成在一起进行测试验证整个系统的功能正确性。
调试与测试方法Tuxedo系统部署与配置系统部署方案单机部署01分布式部署02集群部署03服务器参数配置事务管理配置资源管理配置包括客户端名称、服务器地址、端口号等参数的配置。
客户端参数配置配置客户端事务的提交和回滚方式,确保客户端与服务器之间的事务一致性。
事务管理配置配置客户端的负载均衡策略,实现请求的均匀分配和故障转移。
TUXEDO技术培训

TUXEDO技术培训
TUXEDO系统的应用基础、通信缓冲区以及通信方式(三)
n WSL工作原理及其配置
n WSL (workstation Listener)是tuxedo提供的工作站监听服务器,应用程序启 动时它开始监听服务器上的某个端口,并根据配置自动启动若干个WSN( workstation Handler),形成”WSL pool“,WSN类似于客户端在服务器的代理 ,并且WSL会根据配置动态调整WSN的进程数量
改进 n TUXEO10.0 增加了TSAM(Tuxedo system and application monitor)应
用监控管理平台。为TUXEDO提供全方位的性能监控和管理服务,根据 时间规则产生告警,并协助进行性能调优。
TUXEDO技术培训
TUXEDO产品介绍以及各版本概述(五)
n TUXEDO系统的关键特点
n 具有三大独特功能:事务监视器、中间件角色、应用服务 器平台角色 1、协调分布式事务,使用XA和两阶段管理协调数据库事务
2、相对独立的结构为用户提供应用开发的简单性和实现自身的价值 3、封装逻辑层的处理,作为应用的统一部署
TUXEDO技术培训
TUXEDO产品介绍以及各版本概述(二)
n 1983年诞生于美国贝尔实验室,最初被命名为 UNITS(Unix Transaction system),之后被开发为 C/S接口的系统架构TUX(Transaction for UNIX) ,最后被命令为“TUX has been Extended for Distirbuted Operation”
tuxedo培训教程

引言:本文是关于Tuxedo培训教程的第二部分,旨在深入介绍Tuxedo技术的相关知识和应用。
Tuxedo是一种高性能、高可用性的分布式应用服务器,广泛应用于大规模事务处理和企业级应用领域。
本文将分为五个方面对Tuxedo进行详细阐述,帮助读者更好地理解和应用该技术。
正文:一、Tuxedo安装与配置1. Tuxedo系统要求:包括硬件和软件要求,例如操作系统、内存、存储等方面的要求。
2. Tuxedo的安装步骤:详细介绍如何下载、安装和配置Tuxedo软件。
3. Tuxedo的配置文件:包括DOMAINS、UBBCONFIG等配置文件的作用和常用参数设置。
4. Tuxedo的环境变量设置:介绍如何设置Tuxedo相关的环境变量,确保系统能正常运行。
二、Tuxedo应用开发1. Tuxedo编程模型:介绍Tuxedo的编程模型,包括服务(Service)、服务器(Server)和客户端(Client)的概念和作用。
2. Tuxedo事务管理:详细解释Tuxedo事务的概念和使用方法,包括事务的起始、提交和回滚操作。
3. Tuxedo服务开发:介绍如何编写和发布Tuxedo服务,包括服务的注册、发布和请求处理过程。
4. Tuxedo客户端开发:讲解如何编写Tuxedo客户端程序,包括连接Tuxedo服务、发送请求和接收响应等步骤。
5. Tuxedo编程示例:通过实际的编程示例演示Tuxedo应用开发的流程和技巧,帮助读者更好地理解和应用。
三、Tuxedo监控与调优1. Tuxedo监控工具:介绍Tuxedo自带的监控工具,如tmadmin和tmj,用于监控和管理Tuxedo域。
2. Tuxedo性能调优:给出一些Tuxedo性能调优的建议和方法,包括资源配置、线程池设置等方面。
3. Tuxedo故障排查:介绍常见的Tuxedo故障和排查方法,如错误日志分析、日志级别配置等。
4. Tuxedo性能分析:介绍常用的性能分析工具和方法,用于定位和解决Tuxedo应用的性能瓶颈问题。
TUXEDO简介

第二章:TUXEDO简介Tuxedo是BEA公司的交易中间件产品,1984年由贝尔实验室开发成功,1992年易主Novell 公司,1996年由BEA公司收购,经过十多年的不断更新和完善,Tuxedo已经发展成为交易中间件领域事实上的标准。
2.1TUXEDO系统的组成部分BEA TUXEDO是由服务器端的事务管理器、可靠队列服务、应用域以及客户端的工作站等几个核心部分组成的。
下面对这几部分进行介绍。
图TUXEDO核心组成1.事务管理器/T运行于服务器端的事务管理器是TUXEDO体系结构的中心,它是每个TUXEDO服务器的核心,提供重要的分布式应用服务,包括:名字服务、数据路由、负载平衡、配置管理、分布式事务管理和安全性管理。
它包含TUXEDO的核心数据结构公告板BB (Bulletin Board),BB中包括服务名、路由信息、请求服务的队列和负载等基本信息,TUXEDO/T负责访问和维护BB中的信息,并利用这些信息实现其各项功能。
2.工作站/WS工作站把TUXEDO ATMI API((注:ATMI,应用事务管理接口,是支持应用开发的一组函数) 扩展到客户端应用程序中,它适用于DOS、Windows3.1/95/98/2000/XP、Windows NT、IBM OS/2、Macintosh OS和所有商用版的UNIX。
有了工作站,开发者用ATMI客户端的功能可透明访问在TUXEDO分布式环境中任何服务器上的服务。
有了工作站,用户可在常见的编程环境中如:Visual Basic,PowerBuilder,DELPHI,VC等编写TUXEDO的客户端程序。
3.可靠队列服务/QTUXEDO提供了一个简单的可靠的队列机制,保证应用系统提交的请求和数据可在网络故障或目的服务器瘫痪等情况下也能递交到目的服务器。
应用程序能将服务请求入队和出队,并可以设定系统,使队列中的请求自动地转发给 TUXEDO的服务进程,并取回处理结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11. 附录11.1 simpsvrUp#include#include "atmi.h"void TOUPPER(TPSVCINFO *rqst){int i;char *buf;long sendlen,rcvlen;for(i = 0; i < rqst->len-1; i++)rqst->data[i] = toupper(rqst->data[i]);userlog("From Client ReqId[%s]",rqst->data);sendlen = rqst->len;if((buf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL){(void) fprintf(stderr,"Error allocating send buffer\n");tpterm();exit(1);}(void) strcpy(buf, rqst->data);if (tpcall("TOLOWER", (char *) buf, 0, (char **)&buf, &rcvlen, (long)0 ) == -1) {userlog( "TPCALL ERROR CODE %d message[%s]", tperrno, tpstrerror(tperrno)); (void) fprintf(stderr, "Tperrno = %d\n", tperrno);tpfree( buf);tpreturn(TPSUCCESS, 0, buf, 0L, 0);}userlog("Call Remote ToLower Success [%s]", buf);tpreturn(TPSUCCESS, 0, buf, 0L, 0);}11.2 simpsvrLow#include#include "atmi.h"void TOLOWER(TPSVCINFO *rqst){int i;for(i = 0; i < rqst->len-1; i++)rqst->data[i] = tolower(rqst->data[i]);userlog("From Client ReqId[%s]",rqst->data);printf("In ToLower");//sleep(10);tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0); }11.3 ubbmp*RESOURCESIPCKEY 45678MASTER site1,site2MAXACCESSERS 1000MAXSERVERS 200MAXSERVICES 100MODEL MPLDBAL YOPTIONS LAN,MIGRATE*MACHINESFireCat1 LMID=site1UID=508GID=508APPDIR="/home/tuxapp/tuxedo"TUXCONFIG="/home/tuxapp/tuxedo/tuxconfig" TUXDIR="/home/tuxedo/tuxedo8.1"TYPE="linux"MAXWSCLIENTS=100FireCat2 LMID=site2UID=508GID=508APPDIR="/home/tuxapp/tuxedo"TUXCONFIG="/home/tuxapp/tuxedo/tuxconfig" TUXDIR="/home/tuxedo/tuxedo8.1"TYPE="LINUX"MAXWSCLIENTS=100*GROUPSGROUP1LMID=site1 GRPNO=1 OPENINFO=NONEGROUP2LMID=site2 GRPNO=2 OPENINFO=NONE*NETWORKsite1 NADDR="//192.168.8.120:6009"NLSADDR="//192.168.8.120:8888"site2 NADDR="//192.168.8.121:7010"NLSADDR="//192.168.8.121:8888"*SERVERSRESTART=N MAXGEN=5 REPLYQ=Y CLOPT="-A"WSL SRVGRP=GROUP1 SRVID=1CLOPT="-A — -n //192.168.8.120:9502 -m 5 -x 5 -M 30"WSL SRVGRP=GROUP2 SRVID=100CLOPT="-A — -n //192.168.8.121:9502 -m 5 -x 5 -M 30"simpsvr SRVGRP=GROUP2 SRVID=11 RQADDR=RQ_simp1 RQPERM=0666 CLOPT="-A -p 1,10:2,1 " MIN=5 MAX=10 simpsvr SRVGRP=GROUP1 SRVID=111 RQADDR=RQ_simp2 RQPERM=0666 CLOPT="-A -p 1,10:2,1 " MIN=5 MAX=10 *SERVICES11.4 country ubbdm*RESOURCESIPCKEY 240000MASTER tuxtestPERM 0666MAXACCESSERS 1000MAXSERVERS 50MAXSERVICES 100MODEL SHMLDBAL YSCANUNIT 5SANITYSCAN 12BBLQUERY 30DBBLWAIT 2BLOCKTIME 6*MACHINESDEFAULT:CharlesLinux LMID=tuxtestMAXWSCLIENTS=100APPDIR="/home/tuxapp/tuxedo"TUXCONFIG="/home/tuxapp/tuxedo/tuxconfig"TUXDIR="/home/tuxedo/tuxedo8.1"ULOGPFX="/home/tuxapp/tuxedo/ULOG"*GROUPSADMINLMID=tuxtest GRPNO=1 OPENINFO=NONEREMITLMID=tuxtest GRPNO=2 OPENINFO=NONEDOMGRPLMID=tuxtest GRPNO=3DOMGRP1LMID=tuxtest GRPNO=4LMID=tuxtest GRPNO=5*SERVERSDEFAULT:CLOPT="-A " REPLYQ=Y RESTART=Y GRACE=0 MAXGEN=5WSL SRVGRP=ADMIN SRVID=1CLOPT="-A -t — -n //111.111.111.22:6666-m 10 -M 100 -x 5"simpsvrUp SRVGRP=REMIT SRVID=10 RQADDR=RQ_simpUp RQPERM=0666 CLOPT="-A – p 1,10:2,1 " MIN=2 MAX=10 DMADM SRVGRP=DOMGRP SRVID=3050 REPLYQ=N RESTART=Y GRACE=0GWADM SRVGRP=DOMGRP1 SRVID=3051 REPLYQ=N RESTART=Y GRACE=0GWTDOMAIN SRVGRP=DOMGRP1 SRVID=3052 RQADDR=RQ_GWT1 REPLYQ=Y RESTART=Y MIN=1 MAX=1GWADM SRVGRP=DOMGRP2 SRVID=3053 REPLYQ=N RESTART=Y GRACE=0GWTDOMAIN SRVGRP=DOMGRP2 SRVID=3054 RQADDR=RQ_GWT2 REPLYQ=Y RESTART=Y MIN=1 MAX=1*SERVICES11.5 countrydom*DM_RESOURCES*DM_LOCAL_DOMAINSHOME1 GWGRP=DOMGRP1CONNECTION_POLICY=ON_STARTUPTYPE=TDOMAINDOMAINID="EPR111"BLOCKTIME=10MAXDATALEN=1000MAXRDOM=89#DMTLOGDEV="/home/tuxapp/tuxedo/tlog/DMTLOG"HOME2 GWGRP=DOMGRP2CONNECTION_POLICY=ON_STARTUPTYPE=TDOMAINDOMAINID="EPR112"BLOCKTIME=10MAXDATALEN=1000*DM_REMOTE_DOMAINSRMTGJ TYPE=TDOMAINDOMAINID=EPRGJ*DM_TDOMAINHOME1 NWADDR="//111.111.111.22.:6651"HOME2 NWADDR="//111.111.111.22:6652"RMTGJ NWADDR="//111.111.111.33:6660"*DM_LOCAL_SERVICESTOUPPER*DM_REMOTE_SERVICES# TOLOWER LDOM= HOME1 RDOM= RMTGJ RNAME= TOLOWER# TOLOWER LDOM= HOME2 RDOM= RMTGJ RNAME= TOLOWER11.6 world ubbdm*RESOURCESIPCKEY 240000MASTER tuxtestPERM 0666MAXACCESSERS 1000MAXSERVERS 50MAXSERVICES 100MODEL SHMLDBAL YSCANUNIT 5SANITYSCAN 12BBLQUERY 30DBBLWAIT 2BLOCKTIME 6*MACHINESDEFAULT:localhost LMID=tuxtestMAXWSCLIENTS=100APPDIR="/home/tuxapp/tuxedo"TUXCONFIG="/home/tuxapp/tuxedo/tuxconfig"TUXDIR="/home/tuxedo/tuxedo8.1"ULOGPFX="/home/tuxapp/tuxedo/ULOG"TLOGDEVICE="/home/tuxapp/tuxedo/tlog/TLOG"*GROUPSADMINLMID=tuxtest GRPNO=1 OPENINFO=NONEREMITLMID=tuxtest GRPNO=2 OPENINFO=NONEDOMGRPLMID=tuxtest GRPNO=3*SERVERSDEFAULT:CLOPT="-A " REPLYQ=Y RESTART=Y GRACE=0 MAXGEN=5WSL SRVGRP=ADMIN SRVID=1CLOPT="-A — -n //111.111.111.121:6669 -m 1 -M 100 -x 5"simpsvrLow SRVGRP=REMIT SRVID=110 RQADDR=RQ_simpLow RQPERM=0666 CLOPT="- A – p 1,10:2,1 " MIN=2 MAX=10 DMADM SRVGRP=DOMGRP SRVID=3050 REPLYQ=NGWADM SRVGRP=DOMGRP SRVID=3051 REPLYQ=NGWTDOMAIN SRVGRP=DOMGRP SRVID=3052 REPLYQ=Y*SERVICES11.7 worlddom*DM_RESOURCES*DM_LOCAL_DOMAINSHOME GWGRP=DOMGRPTYPE=TDOMAINDOMAINID="EPRGJ"BLOCKTIME=10MAXDATALEN=1000MAXRDOM=89#DMTLOGDEV="/home/tuxapp/tuxedo/tlog/DMTLOG"*DM_REMOTE_DOMAINSRMT111 TYPE=TDOMAINDOMAINID=EPR111RMT112 TYPE=TDOMAINDOMAINID=EPR112*DM_TDOMAINHOME NWADDR="//111.111.111.121:6660"RMT111 NWADDR="//111.111.111.120:6651"RMT112 NWADDR="//111.111.111.120:6652"*DM_LOCAL_SERVICES#TOUPPERTOLOWER*DM_REMOTE_SERVICESTOUPPER#TOLOWER11.8 LoadRunner Scriptvuser_init:vuser_init(){return 0;}Action:#include "lrt.h"#include "replay.vdf"Action(){lrt_tuxputenv("WSNADDR=//111.111.111.22:6666");tpresult_int = lrt_tpinitialize(LRT_END_OF_PARMS);lrt_abort_on_error();data_0 = lrt_tpalloc("STRING", "", 4); lrt_strcpy(data_0, sbuf_1);data_1 = lrt_tpalloc("STRING", "", 4); tpresult_int = lrt_tpcall("TOUPPER", data_0,0,&data_1,&olen,0);lrt_abort_on_error();lrt_tpfree(data_0);lrt_tpfree(data_1);lrt_tpterm();return 0;}vuser_end:vuser_end(){return 0;}replay.vdf:#ifndef TUXVDF_H#define TUXVDF_Hchar* data_0;char* data_1;static const char sbuf_1[] ="yyy";/* Reply STRING buffer 1"yyy""\x0";Reply buffer */#endif11.9 bang Program#include#include"atmi.h"#include#include#include#include#includevoidPrtMillTime(char*);voidscallserver(intbuflen,char*sbuf);main(void){inti,j;charsToDo[200];charsReqId[11];pid_tchild;memset(sToDo,’\0′,sizeof(sToDo));memset(sReqId,’\0′,sizeof(sReqId));PrtMillTime(sReqId);printf("starttime[%s]\n",sReqId);for(i=0;i<=30;i++){if((child=fork())==-1){//printf("ForkError:%s\n",strerror(errno));printf("ForkError\n");exit(1);}elseif(child==0){sprintf(sToDo,"%s%d\n","/home/tuxapp/bin/simpcli",getpid()); for(j=0;j<100;j++){//PrtMillTime(sReqId);//printf("Iamthechild:%ld\n",getpid());sprintf(sToDo,"%d",getpid());scallserver(1,sToDo);}exit(2);}}PrtMillTime(sReqId);printf("endtime[%s]\n",sReqId);exit(0);}voidPrtMillTime(char*sDesc){structtm*tmCurTime;structtimebtbTimeBlock;charszDescription[41];charsRet[20];memset(szDescription,0,sizeof(szDescription));strncpy(szDescription,sDesc,40);memset(sRet,’\0′,sizeof(sRet));ftime(&tbTimeBlock);tmCurTime=localtime(&tbTimeBlock.time);sprintf(sDesc,"%02d%02d%02d%02d%03d",tmCurTime->tm_mday,tmCurTime->tm_hour,tmCurTime->tm_min,tmCurTime->tm_sec,litm);}voidscallserver(intbuflen,char*sbuf){char*buf;longsendlen,rcvlen;intret;if(tpinit((TPINIT*)NULL)==-1){(void)fprintf(stderr,"Tpinitfailed\n");exit(1);}sendlen=strlen(sbuf);if((buf=(char*)tpalloc("STRING",NULL,sendlen+1))==NULL){(void)fprintf(stderr,"Errorallocatingsendbuffer\n");tpterm();exit(1);}(void)strcpy(buf,sbuf);ret=tpcall("TOUPPER",(char*)buf,0,(char**)&buf,&rcvlen,(long)0);if(ret==-1){(void)fprintf(stderr,"Can’tsendrequesttoserviceTOUPPER\n");(void)fprintf(stderr,"Tperrno=%dmessage[%s]\n",tperrno,tpstrerror(tperrno));tpfree(buf);tpterm();exit(1);}tpfree(buf);tpterm();}编辑于联动北方技术论坛。