Tuxedo是BEA公司(现已被Oracle公司收购)的一个客户机/服务器的“中间件”产品,它在客户机和服务器之间进行调节,以保证正确地处理事务。它用C语言技术开发的并且有很高性能。
TUXEDO是在、Internet 这样的分布式运算环境中开发和管理三层结构的客户/服务器型关键任务应用系统的强有力工具。它具备分布式事务处理和应用通信功能,并提供完善的各种服务来建立、运行和管理关键任务应用系统。开发人员能够用它建立跨多个硬件平台、数据库和操作系统的可互操作的应用系统。
Tuxedo 的主要作用是:
屏蔽分布式环境中各种通信协议、硬件体系结构、操作系统、数据库和其它应用服务等方面的差异,使分布于网络节点上的应用程序的各个单元部件之间能够进行互操作,并协调操作的一致性和完整性,最大限度地节省系统资源,提高系统性能。
* Tuxedo 已经广泛地应用于金融、电信、制造业等各行各业的核心业务系统。
详细介绍请浏览虫师博客: http://www.cnblogs.com/fnng/archive/2013/02/10/2909860.html在主要是对我在使用loadrunner对tuxedo协议脚本开发的总结和说明
1.安装tuxedo客户端
(1)安装成功后,(如果运行脚本时,报ERROR : TUXEDO library libwsc.dll was not found in search path,将缺少libwsc.dll包放置windows系统下system32下面)
(2)设置tuxedo环境变量,在path中增加tuxedo/bin目录。
2.开发脚本,选择tuxedo协议类型
init部分:
<span style="white-space:pre"> </span>int ret = 0 ;
//定义初始化环境
static char *env_allow_array[] = {
"WSNADDR=",
"TUXDIR=",
NULL
};
//获取初始化环境列表
lrt_set_env_list (env_allow_array);
//更改客户端tuxedo应用地址
lrt_tuxputenv ("TUXDIR=C:\\bea\\tuxedo8.1");
//更改tuxedo服务器端ip和port
lrt_tuxputenv ("WSNADDR=//10.0.32.16:55325");
//初始化环境
tpresult_int = lrt_tpinitialize (LRT_END_OF_PARMS);
//报错时终止
lrt_abort_on_error ();
return 0;
action部分:
int total_len; //发送buffer长度
long receive_len = 10000; //接收buffer长度
char resp_code[1000] = {0}; //返回校验信息
char err_msg[1000] ={0};
char *send_buffer; //发送buffer数据
char *receive_buffer; //接收buffer数据
char szData[4096+1];
memset( szData, 0x00, sizeof(szData) );
//分配内存空间
//tuxedo 发送和接收使用的数据类型,STRING为字符串
send_buffer = lrt_tpalloc ("STRING","",4096);
receive_buffer = lrt_tpalloc ("STRING","",4096);
sprintf(szData,lr_eval_string ("_jym 1202\n"
"_jgm {jgm1}\n" //机构码1801061000
"_tradeseq 1\n"
"_hostseqno\n"
"_gyh {gyh1}\n" //柜员号{gyh1}610015
"_ttyno ttyp2\n"
"SQGY\n"
"SQMM\n"
"_SQM\n"
"JDRQ\n"
"S100 0\n"
"_SndFile\n"
"_GYXH 0\n"
"I080 5\n"
"JYJE 100.00\n" //金额
"_HBH 1\n"
"__XH \n"
"__ZH {ZH}\n" //账号91032280025743000011{ZH}
));
//lr_output_message( "[%s]\n", szData );
sprintf( send_buffer, "%.*s", 4096 , szData );
memset(resp_code,0,sizeof(resp_code));
total_len = strlen(send_buffer);
lr_start_transaction ("HX_1202_有折存款");
//发送buffer并接收返回buffer数据
tpresult_int = lrt_tpcall ("ckyw",(char *)send_buffer,total_len,(char **)&receive_buffer,&receive_len,0);
if(tpresult_int != 0){
lr_error_message("failed,发送失败,tpresult_int-----%d",tpresult_int);
lr_end_transaction ("HX_1202_有折存款",LR_FAIL);
}
//解密报文
data_discrypt(receive_buffer);
//rec_total_len=strlen(receive_buffer);
//lr_output_message("rec_total_len :%s",rec_total_len);
//lr_output_message("rec_total_len:%d",rec_total_len);
//memcpy(resp_code,receive_buffer+88,15);
//memcpy(resp_code,receive_buffer,120);
//lr_output_message("resp_code:%s",resp_code);
//lr_output_message("receive_buffer:%s",receive_buffer);
//使用获取函数,第一个参数,搜索符串字键字;第二个参数,被搜索字符串,第三个参数,返回结果
get_string( "_hostcode",receive_buffer,resp_code);
//lr_output_message("test-----%s",resp_code);
//if(strstr(resp_code,"_hostcode 0000") != NULL){
//if(strstr(receive_buffer,"_hostcode 0000") != NULL){
//两个字符串比较,相等时返回0
if(strcmp(resp_code,"0000")==0){
//lr_output_message("transaction is failed,receive_buffer is-----------%s",receive_buffer);
lr_end_transaction ("HX_1202_有折存款",LR_PASS);
}else{
//lr_output_message("transaction is failed,resp_code is-----------%s",resp_code);
//lr_output_message("transaction is failed,receive_buffer is-----------%s",receive_buffer);
lr_error_message("failed,receive_buffer is----%s",receive_buffer);
lr_end_transaction ("test",LR_FAIL);
}
//释放内存空间
lrt_tpfree (send_buffer);
lrt_tpfree (receive_buffer);
return 0;
#define FAILURE -1
#define SUCCESS 0
//取字符串
// eg:get_string( "_SndFile", UP.upbuf, _RecvFile );
long get_string(lrs_word,lrs_buf,lrs_str)
char *lrs_word; /*关键字*/
char *lrs_buf; /*缓冲区*/
char *lrs_str; /*字符串*/
{
char *lrp_p; /*字符串位置指针*/
long j = 0; /*计数器*/
long lrl_flag; /*关键字对应字符串是否为空标识*/
/*在缓冲区中查找关键字所对字符串的首地址*/
lrp_p = strstr1(lrs_buf,lrs_word,&lrl_flag);
if ( lrp_p == NULL )
{
strcpy( lrs_str, " ") ;
return(FAILURE);
}
/*如果lrl_flag为真,则缓冲区中*/
/*该关键字对应的字符串为空. */
if ( lrl_flag )
{
lrs_str[j++] = ' ';
}
else /*读取关键字对应的字符串*/
{
while ( ( (unsigned char) *lrp_p != SPLITCH) && (*lrp_p != '\0') )
{
lrs_str[j++] = *lrp_p;
lrp_p++;
}
}
/*给字符串加上结束符*/
lrs_str[j] = '\0';
return(SUCCESS);
}
end 部分:
//断开客户端连接
lrt_tpterm ();
return 0;