首页 > 基础资料 博客日记
LoadRunner各协议范例-IBM-MQ协议(C语言 、Java)
2023-08-06 19:13:49基础资料围观283次
这篇文章介绍了 LoadRunner各协议范例-IBM-MQ协议(C语言 、Java),分享给大家做个参考,收藏Java资料网收获更多编程知识
IBM-MQ简介:
IBM MQ(IBM Message Queue)是IBM的一款商业消息中间产品,适用于分布式计算环境或异构系统之中。消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。
通过消息队列应用程序可独立地执行,它们不需要知道彼此的位或在继续执行前不需要等待接收程序接收此消息。
详细信息访问官方文档:https://www.ibm.com/docs/en/ibm-mq/8.0
相关概念:
对列管理器
队列管理器是MQ系统中最上层的一个概念,由它为我们提供基于队列的消息服务。
对列
队列是消息的安全存放地,队列存储消息直到它被应用程序处理。
队列类型可分为:本地队列、传输队列、远程队列、别名队列、模型队列、集群队列、共享队列、组定义队列
队列类型
|
描述
|
---|---|
本地队列 | 本地队列是队列以及与此队列关联的一组消息的定义。主管队列的队列管理器在其本地队列中接收消息。 |
传输队列 | 传输队列是特殊类型的本地队列。当队列管理器将消息发送至远程队列管理器上的队列时,传输队列在本地存储此消息,直到远程队列管理器上的队列可用。要创建传输队列,创建一个本地队列并将其用法属性更改为“传输”。 |
远程队列定义 | 远程队列定义是属于另一个队列管理器的队列的本地队列管理器上的定义。要将消息发送至远程队列管理器上的队列,发送方队列管理器必须具有目标队列的远程定义。 |
别名队列 | 别名队列实际上不是队列;它们是现有队列的附加定义。您创建指向实际本地队列的别名队列定义,但可以用与本地队列(基本队列)不同的名称来命名别名队列定义。这表示您可更改应用程序使用的队列而无需更改此应用程序,您只需创建指向新的本地队列的别名队列定义。 |
模型队列 | 模型队列是您想让队列管理器根据需要动态创建的队列的模板。当应用程序尝试将消息放置到模型队列时,队列管理器将动态地创建与此模型队列同名的本地队列。以此方式创建的队列既可以是临时队列也可以是永久队列。 |
集群队列 | 集群队列是在集群中已共享的队列,这样的话,此集群中的所有队列管理器可使用集群通道在此队列放置和获取消息。有关更多信息,请参阅队列管理器集群。 |
共享队列 | 仅限 z/OS®。共享队列是队列共享组处置为共享 的队列。队列共享组中的所有队列管理器都可在此队列进行放置和获取操作,而无需活动通道。只有本地队列可拥有共享 处置。有关更多信息,请参阅队列共享组。 |
组定义队列 | 仅限 z/OS。组队列是队列共享组处置为组 的队列。队列共享组中的每个队列管理器都有一个该队列的副本(处置为副本 )存储在他们自己的页集中。本地队列、远程队列、别名队列和模型队列可拥有组 处置。有关更多信息,请参阅队列共享组。 |
其他关于MQ队列内容访问:https://www.ibm.com/docs/zh/ibm-mq/9.1?topic=types-queues
通道
通道是MQ系统中队列管理器之间传递消息的管道,它是建立在物理的网络连接之上的一个逻辑概念,也是MQ产品的精华。
在 MQ中,主要有三大类通道类型,即消息通道,MQI通道和Cluster通道。
消息通道:
是用于在MQ的服务器和服务器之间传输消息的,需要强调指出的是, 该通道是单向的,它又有发送(sender), 接收(receive), 请求者(requestor), 服务者(server)等不同类型,供用户在不同情况下使用。
MQI通道:
是MQ Client和MQ Server之间通讯和传输消息用的,与消息通道不同,它的传输是双向的。
群集(Cluster)通道:
是位于同一个MQ 群集内部的队列管理器之间通讯使用的。
其他关于MQ通道内容访问:https://www.ibm.com/docs/zh/ibm-mq/9.1?topic=explorer-channels
消息
在MQ中,我们把应用程序交由MQ传输的数据定义为消息,我们可以定义消息的内容并对消息进行广义的理解。
比如:用户的各种类型的数据文件,某个应用向其 它应用发出的处理请求等都可以作为消息。
消息有两部分组成:
消息描述符(Message Discription或Message Header),描述消息的特征,如:消息的优先级、生命周期、消息Id等;
消息体(Message Body),即用户数据部分。
在MQ中,消息分为两种类型,非永久性(non-persistent)消息和永久性(persistent)消息:
非永久性消息是存储在内存中的,它是为了提高性能而设计的,当系统掉电或MQ队列管理器重新启动时,将不可恢复。当用户对消息的可靠性要求不高,而侧重系统的性 能表现时,可以采用该种类型的消息,如:当发布股票信息时,由于股票信息是不断更新的,我们可能每若干秒就会发布一次,新的消息会不断覆盖旧的消息。
永久性消息是存储在硬盘上,并且纪录数据日志的,它具有高可靠性,在网络和系统发生故障等情况下都能确保消息不丢、不重。
此外,在MQ中,还有逻辑消息和物理消息的概念。
利用逻辑消息和物理消息,我们可以将大消息进行分段处理,也可以将若干个本身完整的消息在应用逻辑上归为一组进行处理。
=========================我是分割线 =========================
Loadrunner11基于IBM-MQ协议的脚本示例(C)
新建Virtual User
File---new...---All Protocols---C Vuser
Virtual User-vuser_init
1 #include "cmqc.h" 2 #include "cmqxc.h" 3 4 5 int DEBUG = 1; 6 int rv; 7 8 9 /*队列管理器的连接句柄,由MQCONNX调用返回*/ 10 MQHCONN Hcon; 11 12 /*完成代码和原因代码*/ 13 MQLONG CompCode; 14 MQLONG Reason; 15 16 /*请求(响应)消息队列句柄,由MQOPEN 调用返回*/ 17 MQHOBJ p_Hobj; 18 MQHOBJ g_Hobj; 19 20 /*关闭选项*/ 21 MQLONG C_options = 0; 22 23 /*打开对象(请求/响应队列)的描述*/ 24 MQOD pod = {MQOD_DEFAULT}; 25 MQOD god = {MQOD_DEFAULT}; 26 27 /*请求/响应消息的描述*/ 28 MQMD pmd = {MQMD_DEFAULT}; 29 MQMD gmd = {MQMD_DEFAULT}; 30 31 /*打开请求/响应队列控制信息*/ 32 MQPMO pmo = {MQPMO_DEFAULT}; 33 MQGMO gmo = {MQGMO_DEFAULT}; 34 35 /*控制打开请求/响应队列函数调用的选项*/ 36 long Op_options; 37 long Og_options; 38 39 //MQ消息上下文关联变量申请 40 MQBYTE myCorrelId[24] = {0}; 41 42 /*设置MQ客户端连接通道,控制MQCONNX行为的选项*/ 43 MQCNO Connect_options = {MQCNO_DEFAULT}; 44 MQCD ClientConn = {MQCD_CLIENT_CONN_DEFAULT}; 45 46 /*返回码*/ 47 char retCode[12]; 48 49 vuser_init() 50 { 51 52 53 //定义队列管理器 54 char QMName[50]; 55 memset(QMName,0x00,sizeof(QMName)); 56 strcpy(QMName, "QM_GW_IN"); 57 58 //设置客户端连接 59 strncpy(ClientConn.ConnectionName, "197.10.130.75(33300)", MQ_CONN_NAME_LENGTH); 60 strncpy(ClientConn.ChannelName, "SVRCONN_GWIN", MQ_CHANNEL_NAME_LENGTH); 61 Connect_options.Version = MQCNO_VERSION_2; 62 Connect_options.ClientConnPtr = &ClientConn; 63 64 65 //lr_load_dll("mqic32.dll"); 66 67 68 //连接远程队列管理器 69 MQCONNX(QMName, &Connect_options, &Hcon, &CompCode, &Reason); 70 if (CompCode == MQCC_FAILED) 71 { 72 if ( DEBUG ) 73 { 74 lr_log_message("****************************************************************"); 75 lr_log_message("MQCONNX failed with reason code %ld\n", Reason); 76 lr_log_message("****************************************************************"); 77 } 78 return; 79 } 80 81 82 83 //打开返回(本地)队列 84 strcpy(god.ObjectName, "REP.TLR"); 85 Og_options = MQOO_INPUT_SHARED | MQOO_INQUIRE | MQOO_FAIL_IF_QUIESCING; 86 MQOPEN(Hcon, &god, Og_options, &g_Hobj, &CompCode, &Reason); 87 if (CompCode == MQCC_FAILED) 88 { 89 if ( DEBUG ) 90 { 91 lr_log_message("****************************************************************"); 92 lr_log_message("Open responese QUEUE failed with reason code %ld\n", Reason); 93 lr_log_message("****************************************************************"); 94 } 95 return; 96 } 97 98 99 100 //打开请求(远程)队列 101 strcpy(pod.ObjectName, "REQ"); 102 //strcpy(pod.ObjectName, "REP.TLR"); 103 Op_options = MQOO_OUTPUT | MQOO_INQUIRE | MQOO_FAIL_IF_QUIESCING; 104 MQOPEN(Hcon, &pod, Op_options, &p_Hobj, &CompCode, &Reason); 105 if (CompCode == MQCC_FAILED) 106 { 107 if ( DEBUG ) 108 { 109 lr_log_message("****************************************************************"); 110 lr_log_message("Open request QUEUE failed with reason code %ld\n", Reason); 111 lr_log_message("****************************************************************"); 112 } 113 114 return; 115 } 116 117 return 0; 118 }
Virtual User-action
1 Action() 2 { 3 /*****************************************************************************/ 4 /*变量声明*/ 5 /*****************************************************************************/ 6 unsigned char MesgID[24] = {0}; 7 unsigned char CorrelId[24] = {0}; 8 unsigned char sndMsg[10240] = {0}; 9 unsigned char bufData[20240] = {0}; 10 unsigned int sndMsgLen; 11 long int recvMsgLen; 12 long int bufferLen, i; 13 int rv=0; 14 15 16 lr_think_time(1); 17 18 /*****************************************************************************/ 19 /*组装报文内容*/ 20 /*****************************************************************************/ 21 strcpy(sndMsg,lr_eval_string("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 22 "<transaction>" 23 "<header>" 24 "<ver>1.0</ver>" 25 "<msg>" 26 "<sndAppCd>TLR</sndAppCd>" 27 "<sndDt>{p_SndDate}</sndDt>" 28 "<sndTm>{p_SndTime}</sndTm>" 29 "<seqNb>{p_SndDate}{p_SndTime}{p_Random_Code_1}{p_Random_Code_2}02</seqNb>" 30 "<msgCd>APS068222400</msgCd>" 31 "<callTyp>SYN</callTyp>" 32 "<rcvAppCd>APS</rcvAppCd>" 33 "</msg>" 34 "</header>" 35 "<body>" 36 "<request>" 37 "<hupp>" 38 "<amtflg>0</amtflg>" 39 "<ccy>CNY</ccy>" 40 "<payeraccttype>5</payeraccttype>" 41 "<payeraccno>6229350107004422703</payeraccno>" 42 "<payername>周星星</payername>" 43 "<nx_fkrmm>888888</nx_fkrmm>" 44 "<nx_zhye>51302.08</nx_zhye>" 45 "<nx_kyye>51302.08</nx_kyye>" 46 "<nx_skhhm>少林寺</nx_skhhm>" 47 "<recvbkid>1340401306</recvbkid>" 48 "<rcveraccttype>PT02</rcveraccttype>" 49 "<rcveraccno>0720202011009800000068</rcveraccno>" 50 "<rcvername>小小</rcvername>" 51 "<amt>100.00</amt>" 52 "<feeamt>5.00</feeamt>" 53 "<nx_jyzje>105.00</nx_jyzje>" 54 "<nx_zjlx>02</nx_zjlx>" 55 "<nx_zjhm>622826198711220212</nx_zjhm>" 56 "<nx_khmc>亚当</nx_khmc>" 57 "<nx_dlrzjlx>05</nx_dlrzjlx>" 58 "<nx_dlrzjhm>01</nx_dlrzjhm>" 59 "<nx_dlrmc>夏娃</nx_dlrmc>" 60 "<addword>附言</addword>" 61 "<remark>备注</remark>" 62 "<nx_lxfs>18675530187</nx_lxfs>" 63 "<txtpcd>C102</txtpcd>" 64 "</hupp>" 65 "<CBSAUTHSTAMSGCD1>DPS9905</CBSAUTHSTAMSGCD1>" //授权 66 "<CBSAUTH>" 67 "<autType>1</autType>" 68 "<autSeqNo>00067977</autSeqNo>" 69 "<autAtlrno>070357</autAtlrno>" 70 "<autAtlrpwd>336413</autAtlrpwd>" 71 "<autAtlrleve>05</autAtlrleve>" 72 "<autAtlrtype>00</autAtlrtype>" 73 "<autBtlrno>070726</autBtlrno>" 74 "<autBtlrpwd>202948</autBtlrpwd>" 75 "<autBtlrleve>02</autBtlrleve>" 76 "<autBtlrtype>00</autBtlrtype>" 77 "<autCtlrno/>" 78 "<autCtlrpwd/>" 79 "<autCtlrleve/>" 80 "<autCtlrtype/>" 81 "<autProcess/>" 82 "</CBSAUTH>" 83 "<pub>" 84 "<appid>nps</appid>" 85 "<transcode>964172</transcode>" 86 "<provno/>" 87 "<transdep>071060201</transdep>" 88 "<operator>070522</operator>" 89 "<transdate>{p_TransDate}</transdate>" 90 "<transtime>{p_TransTime}</transtime>" 91 "<auther/>" 92 "<termnum/>" 93 "<channelseq>{p_SeqDate}{p_SndTime}{p_Random_Code}</channelseq>" 94 "<channelid>06</channelid>" 95 "</pub>" 96 "<CBSSTDREQ>" 97 "<hasAuthMsg>1</hasAuthMsg>" 98 "</CBSSTDREQ>" 99 "</request>" 100 "</body>" 101 "</transaction>")); 102 103 lr_log_message("sndMsglen content is %s", (char *)sndMsg); 104 lr_convert_string_encoding((char *)sndMsg, LR_ENC_SYSTEM_LOCALE, LR_ENC_UTF8, "P_sendMsgContent"); 105 //lr_convert_string_encoding((char *)sndMsg, LR_ENC_SYSTEM_LOCALE,NULL, "P_sendMsgContent"); 106 sndMsgLen = strlen(lr_eval_string("{P_sendMsgContent}")); 107 lr_log_message("sndMsglen is %d & content is %s", sndMsgLen, lr_eval_string("{P_sendMsgContent}")); 108 109 110 memcpy(pmd.MsgId, MQMI_NONE, sizeof(pmd.MsgId)); 111 memcpy(pmd.CorrelId, MQCI_NONE, sizeof(pmd.CorrelId)); 112 113 pmd.Encoding = MQENC_NATIVE; 114 pmd.CodedCharSetId = 1208; 115 memcpy(pmd.Format, MQFMT_STRING, (size_t)MQ_FORMAT_LENGTH); 116 117 memcpy(pmd.CorrelId, lr_eval_string("{p_SndDate}{p_SndTime}{p_Random_Code_1}{p_Random_Code_2}02"), sizeof(pmd.CorrelId)); 118 bufferLen = sizeof(bufData) - 1; 119 memcpy(pmd.MsgId, pmd.CorrelId, sizeof(pmd.CorrelId)); 120 121 122 123 lr_start_transaction("事物名称"); 124 125 126 /*发送请求消息*/ 127 //MQPUT(Hcon, p_Hobj, &pmd, &pmo, sndMsgLen, lr_eval_string("{P_sendMsgContent}"), &CompCode, &Reason); 128 MQPUT(Hcon, p_Hobj, &pmd, &pmo, sndMsgLen, lr_eval_string("{P_sendMsgContent}") , &CompCode, &Reason); 129 if (Reason != MQRC_NONE) 130 { 131 lr_log_message("****************************************************************"); 132 lr_log_message("PUT request MSG failed with reason code %ld\n", Reason); 133 lr_log_message("****************************************************************"); 134 lr_log_message("事物名称-发送失败"); 135 lr_end_transaction("事物名称",LR_FAIL); 136 lr_end_transaction("事物名称_组包发送",LR_FAIL); 137 return; 138 }else{ 139 lr_log_message("事物名称,交易发送成功"); 140 lr_end_transaction("事物名称_组包发送",LR_PASS); 141 180 } 181 182 return 0; 183 }
Virtal User- vuser_end
1 vuser_end() 2 { 3 /*关闭请求队列*/ 4 MQCLOSE(Hcon, &p_Hobj, C_options, &CompCode, &Reason); 5 if (Reason != MQRC_NONE) 6 { 7 if ( DEBUG ) 8 { 9 lr_output_message("****************************************************************"); 10 lr_output_message("CLOSE request QUEUE failed with reason code %ld\n", Reason); 11 lr_output_message("****************************************************************"); 12 } 13 return; 14 } 15 16 17 18 /*关闭响应队列*/ 19 MQCLOSE(Hcon, &g_Hobj, C_options, &CompCode, &Reason); 20 if (Reason != MQRC_NONE) 21 { 22 if ( DEBUG ) 23 { 24 lr_output_message("****************************************************************"); 25 lr_output_message("CLOSE responese QUEUE failed with reason code %ld\n", Reason); 26 lr_output_message("****************************************************************"); 27 } 28 return; 29 } 30 31 32 33 34 /*关闭队列管理器*/ 35 MQDISC(&Hcon, &CompCode, &Reason); 36 if (Reason != MQRC_NONE) 37 { 38 if ( DEBUG ) 39 { 40 lr_output_message("****************************************************************"); 41 lr_output_message("MQDISC QM failed with reason code %ld\n", Reason); 42 lr_output_message("****************************************************************"); 43 } 44 return; 45 } 46 47 return 0; 48 }
=========================我是分割线 =========================
Loadrunner11基于IBM-MQ协议的脚本示例(Java)
移步: https://www.cnblogs.com/snifferhu/p/4011079.html
文章来源:https://www.cnblogs.com/hzwh/p/16494792.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: