消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。

银行脚本使用MQ通信的较多,下面介绍一个MQ的脚本:

MQ的脚本分为SEND和RECIVE两部分

send部分:

import com.ibm.mq.*;
import lrapi.lr; public class Actions
{
String PutQueueManagerName = "QMCPG1"; // 发送队列管理器
String PutQueueName = "HVPSBANK"; // 发送队列名,相当于前置机的接收队列
String QueueChannel = "xn_rcv"; // 通道名,要用服务器通道
int PutPort = ; // 发送端口号,相当于前置机的接收端口
int CCSID = ; // 客户端Unix用819,windows用1381
int OpenOptions = MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT|MQC.MQOO_INQUIRE; // 连接参数
int PutDepth = ; // 发送队列深度
String SndTime = ""; // 当前发送时间 MQQueueManager PutQueueManager = null; // 创建发送队列管理器对象
MQQueue PutQueue = null; // 创建发送队列对象
MQMessage PutMessage = new MQMessage(); // 创建发送消息对象
MQPutMessageOptions PMO = new MQPutMessageOptions(); // 创建发送消息选项队列 public int init() throws Throwable
{
// 发送队列的参数**********************************************
MQEnvironment.hostname = lr.eval_string("<HostIP>"); // 设置环境参数
MQEnvironment.port = PutPort;
MQEnvironment.CCSID = CCSID;
MQEnvironment.channel = QueueChannel;
PutQueueManager = new MQQueueManager(PutQueueManagerName); // 连接发送队列管理器
PutQueue = PutQueueManager.accessQueue(PutQueueName, OpenOptions, null, null, null); // 建立访问发送队列
PutMessage.format = MQC.MQFMT_STRING; // 设置消息中应用数据的格式
PutMessage.characterSet = ; // 设置字符集
PutMessage.expiry = -; // 设置消息为不过期 return ;
}//end of init public int action() throws Throwable
{
SndTime = String.valueOf(System.currentTimeMillis()); // 获取当前发送时间,13位
lr.start_transaction("02_CP2I111_大额来帐_发送"); PutQueueMessage("{H:" +
"" +
"309391000011 " +
"HVPS" +
"306581000003 " +
"HVPS" +
"<Date>" + // 报文发起日期
"<Time>" + // 报文发起时间
"XML" +
"hvps.111.001.01 " +
SndTime + "<Num>" + // 通信级标识号,CNAPS2SIMU0000088212,20位,接收方根据OrigSender+OrigSendDate+MesgID唯一确定一个报文,该三项重复的报文作为通信级重复报文;
SndTime + "<Num>" + // 通信级参考号,CNAPS2SIMU0000030415,20位,标识本报文的关联报文,由OrigSender设置,后续节点应保持该域不变,并在通信回应报文中带回该值,以便OrigSender匹配原报文;
"" +
"D" +
" " +
"}\r\n" +
"{S:" + // 数字签名域起始标识
"2016110700130322|2016-11-07T14:25:01|1|2016110700130322|A100|CNY10.05|NORM|309391000011|309391000011|306581000003|306588000016|321|123|309391000011|306588000016|xingneng|6214620421000208396|02102|" + // 数字签名内容
"}\r\n" + // 数字签名域结束标识
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<Document xmlns=\"urn:iso:std:iso:20022:tech:xsd:pacs.008.001.02\">" +
"<FIToFICstmrCdtTrf>" +
"<GrpHdr>" +
"<MsgId>" + "<Date>" + "<Time>" + "<MsgNum>" + "</MsgId>" + // 报文标识号,最大35位,最好是8位日期+8位流水,否则二代后台会处理异常,2016111015130018
"<CreDtTm>2016-11-07T14:25:01</CreDtTm>" +
"<NbOfTxs>1</NbOfTxs>" +
"<SttlmInf>" +
"<SttlmMtd>CLRG</SttlmMtd>" +
"</SttlmInf>" +
"</GrpHdr>" +
"<CdtTrfTxInf>" +
"<PmtId>" +
"<EndToEndId>1</EndToEndId>" +
"<TxId>" + SndTime + "<Num>" + "</TxId>" + // 交易标识号,最大35位,2016110700130322
"</PmtId>" +
"<PmtTpInf>" +
"<CtgyPurp>" +
"<Prtry>A100</Prtry>" +
"</CtgyPurp>" +
"</PmtTpInf>" +
"<IntrBkSttlmAmt Ccy=\"CNY\">0.02</IntrBkSttlmAmt>" + // 金额
"<SttlmPrty>NORM</SttlmPrty>" +
"<ChrgBr>DEBT</ChrgBr>" +
"<InstgAgt>" +
"<FinInstnId>" +
"<ClrSysMmbId>" +
"<MmbId>309391000011</MmbId>" + // 付款清算行行号
"</ClrSysMmbId>" +
"</FinInstnId>" +
"<BrnchId>" +
"<Id>309391000011</Id>" + // 收款行行号
"</BrnchId>" +
"</InstgAgt>" +
"<InstdAgt>" +
"<FinInstnId>" +
"<ClrSysMmbId>" +
"<MmbId>306581000003</MmbId>" + // 收款清算行行号
"</ClrSysMmbId>" +
"</FinInstnId>" +
"<BrnchId>" +
"<Id>306588000016</Id>" + // 收款行行号
"</BrnchId>" +
"</InstdAgt>" +
"<Dbtr>" +
"<Nm>沈监</Nm>" + // 付款人名称
"</Dbtr>" +
"<DbtrAcct>" +
"<Id>" +
"<Othr>" +
"<Id>6225684352000160189</Id>" + // 付款人账号
"</Othr>" +
"</Id>" +
"</DbtrAcct>" +
"<DbtrAgt>" +
"<FinInstnId>" +
"<ClrSysMmbId>" +
"<MmbId>309391000011</MmbId>" + // 付款人开户行行号
"</ClrSysMmbId>" +
"</FinInstnId>" +
"</DbtrAgt>" +
"<CdtrAgt>" +
"<FinInstnId>" +
"<ClrSysMmbId>" +
"<MmbId>306588000016</MmbId>" + // 收款人开户行行号
"</ClrSysMmbId>" +
"</FinInstnId>" +
"</CdtrAgt>" +
"<Cdtr>" +
"<Nm>燕净</Nm>" + // 收款人名称
"</Cdtr>" +
"<CdtrAcct>" +
"<Id>" +
"<Othr>" +
"<Id>6225684341000008415</Id>" + // 收款人账号
"</Othr>" +
"</Id>" +
"</CdtrAcct>" +
"<Purp>" +
"<Prtry>02102</Prtry>" + // 业务种类编码
"</Purp>" +
"<RmtInf>" +
"<Ustrd>/C00/2016-11-07</Ustrd>" + // 备注
"</RmtInf>" +
"</CdtTrfTxInf>" +
"</FIToFICstmrCdtTrf>" +
"</Document>"); lr.end_transaction("02_CP2I111_大额来帐_发送",lr.PASS); return ;
}//end of action public int end() throws Throwable
{
try
{
PutQueue.close();
PutQueueManager.close();
PutQueueManager.disconnect();
}
catch (MQException ex)
{
lr.error_message("02_CP2I111_大额来帐_发送退出关闭队列时出现错误,完成代码为:" + ex.completionCode + ",原因为:" + ex.reasonCode);
ex.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
} return ;
}// end of end // 发送消息++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public void PutQueueMessage(String MyStr)
{
try
{
PutMessage = new MQMessage();
PutMessage.write(MyStr.getBytes("UTF-8")); // 呵呵
PutQueue.put(PutMessage, PMO);// 将消息放入队列
PutQueueManager.commit(); // 提交事务处理
//PutDepth = PutQueue.getCurrentDepth(); // 获取发送队列的深度
//System.out.println("++++++发送队列当前深度为:"+ PutDepth);
//System.out.println("=======发送报文是:" + MyStr);
PutMessage.clearMessage();
PutMessage = null;
}
catch (MQException ex)
{
lr.end_transaction("02_CP2I111_大额来帐_发送",lr.FAIL);
lr.error_message("02_CP2I111_大额来帐_发送_发送消息时出错,完成代码为:" + ex.completionCode + ",原因为:" + ex.reasonCode + "流水号为:" + SndTime);
lr.exit(lr.EXIT_ITERATION_AND_CONTINUE, lr.FAIL);
//System.out.println("发送消息时出现错误,完成代码为:" + ex.completionCode + ",原因为:" + ex.reasonCode);
//ex.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

RECIVE部分:

/*
* LoadRunner Java script. (Build: _build_number_)
*
* Script Description:
*
*/
import java.util.Date;
import com.ibm.mq.*;
import lrapi.lr; public class Actions
{
String GetQueueManagerName = "QMCPG1"; // 接收队列管理器
String GetQueueName = "306581000003.MBFEA.PBCTOBANK"; // 接收队列名,相当于前置机的发送队列
String QueueChannel = "xn_rsp"; // 通道名,要用服务器通道
//String HostName = lr.eval_string("<HostIP>"); // ip 地址
int GetPort = ; // 接收端口号,相当于前置机的发送端口
int CCSID = ; // 客户端Unix用819,windows用1381
int OpenOptions = MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT|MQC.MQOO_INQUIRE; // 连接参数
int GetDepth = ; // 接收队列深度 MQQueueManager GetQueueManager = null; // 创建接收队列管理器对象
MQQueue GetQueue = null; // 创建接收队列对象
MQMessage GetMessage = new MQMessage(); // 创建接收消息对象
MQGetMessageOptions GMO = new MQGetMessageOptions(); // 创建接收消息选项对象 public int init() throws Throwable
{
// 接收队列的参数***********************************************
MQEnvironment.hostname = lr.eval_string("<HostIP>"); // 设置环境参数
MQEnvironment.port = GetPort;
MQEnvironment.CCSID = CCSID;
MQEnvironment.channel = QueueChannel;
GetQueueManager = new MQQueueManager(GetQueueManagerName); // 连接接收队列管理器
GetQueue = GetQueueManager.accessQueue(GetQueueName, OpenOptions, null , null, null); // 建立访问接收队列
GetMessage.format = MQC.MQFMT_STRING; // 设置消息体参数
GetMessage.characterSet = ;
GetMessage.expiry = -;
GMO.waitInterval = ; // 等待时间限制
GMO.options = MQC.MQGMO_NO_WAIT; // 如果队列没有消息则立即返回 return ;
}//end of init public int action() throws Throwable
{
String Msg = null;
String NowTime = null; try
{
GetMessage = new MQMessage(); // 必须新建实例,否则无法多次迭代无法继续接收消息
GetDepth = GetQueue.getCurrentDepth(); // 获取接收队列的深度
if(GetDepth > ) //接收队列深度不为0则打印消息
{
GetQueue.get(GetMessage, GMO);
GetQueueManager.commit();
//System.out.println("======接收队列当前深度为:"+ GetDepth);
NowTime = String.valueOf(System.currentTimeMillis()); // 记录当前时间戳作为接收时间,13位
Msg = GetMessage.readString(GetMessage.getMessageLength());
CompResult(Msg,NowTime); // 记录接收时间、流水、交易码(所接收的交易返回信息不一定为当前程序发出的交易)
//System.out.println("======接收消息的内容为:\n" + Msg);
GetMessage.clearMessage();
GetMessage = null;
}
else
{
System.out.println("++++++接收队列无消息++++++");
}
}
catch(MQException ex)
{
if(ex.reasonCode == )
{
// 2033是没有消息,不做处理
}
else
{
lr.error_message("02_CP2I111_大额来帐_接收接收消息时出错,完成代码为:" + ex.completionCode + ",原因为:" + ex.reasonCode + ",流水号为:" + NowTime);
ex.printStackTrace();
}
}
catch(Exception e)
{
e.printStackTrace();
} return ;
}//end of action public int end() throws Throwable
{
try
{
GetQueue.close(); // 关闭队列
GetQueueManager.close(); // 关闭队列管理器
GetQueueManager.disconnect(); // 断开连接
}
catch (MQException ex)
{
lr.error_message("02_CP2I111_大额来帐_接收关闭队列时出现错误,完成代码为:" + ex.completionCode + ",原因为:" + ex.reasonCode);
ex.printStackTrace();
} return ;
}// end of end // 统计交易结果
public void CompResult(String MSG, String RecTime)
{
boolean Result = true; // 交易是否成功
String StartTime = null;
double DurTime = ; // 交易处理时间
int FlowIndex = -; // 位置
String FlowNo = null;
int ErrIndex = -; // 错误码位置
String ErrCode = null; FlowIndex = MSG.indexOf("<MsgId>"); // 流水号的位置
StartTime = MSG.substring(FlowIndex+, FlowIndex++); // 从流水号获取开始时间
DurTime = (Double.parseDouble(RecTime) - Double.parseDouble(StartTime))/; // 单位秒
//lr.error_message("======处理时间是:" + DurTime + "发送时间是:" + StartTime + "接收时间是:" + RecTime + "返回报文是:" + MSG);
ErrIndex = MSG.indexOf("<MsgPrcCd>"); // 错误码的位置
ErrCode = MSG.substring(ErrIndex+, ErrIndex++); // 错误码
if(!ErrCode.equals("CU0I0000")) // 成功状态码是CU0I0000,交易失败则获取流水号
{
Result = false;
FlowNo = MSG.substring(FlowIndex+, FlowIndex++); // 流水号
lr.error_message("02_CP2I111_大额来帐_接收交易失败!出错流水号是:" + FlowNo + ",错误码是:" + ErrCode + ",完整出错信息是:" + MSG);
} // 统计事务响应时间和成功率
if(Result)
{
lr.set_transaction("02_CP2I111_大额来帐_接收", DurTime, lr.PASS);
//lr.error_message("======02_CP2I111_DELZ交易事务处理时间是:" + DurTime);
}
else
{
lr.set_transaction("02_CP2I111_大额来帐_接收", DurTime, lr.FAIL);
}
}
} // 正确返回报文:
//{H:02306581000003 HVPS309391000011 HVPS20161110164516XMLccms.990.001.02 20161110HVPS00062057012016111016501100013U }
//<?xml version="1.0" encoding="UTF-8"?>
//<Document xmlns="urn:cnaps:std:ccms:2010:tech:xsd:ccms.990.001.02"><ComConf><ConfInf><OrigSndr>309391000011</OrigSndr><OrigSndDt>20161110</OrigSndDt><MT>hvps.111.001.01</MT><MsgId>01201611101650110001</MsgId><MsgRefId>01201611101650110001</MsgRefId><MsgPrcCd>CU0I0000</MsgPrcCd></ConfInf></ComConf></Document>

[性能测试]:关于MQ协议脚本开发的更多相关文章

  1. lr_java user协议脚本开发

    1.准备工作,安装jdk,配置环境变量 lr11 jdk1.6 32位 lr12 jdk1.7 32位 注:若原已安装了jdk1.8,现要安装jdk1.7,若遇到安装好1.7并配置好环境后,在cmd中 ...

  2. [LoadRunner]性能测试实践_Hessian协议脚本编写

    第一步,新建LR的脚本,选择Java Vuser协议: 第二步,编写hessian测试脚本,如下: import lrapi.lr; import java.net.MalformedURLExcep ...

  3. [LoadRunner]性能测试实践_Hessian协议脚本编写2

    协议选取和运行配置请参考:http://www.cnblogs.com/whylaughing/p/5430821.html 这次直接贴代码让大家参考: import lrapi.lr; import ...

  4. 性能测试学习 第八课--LR12中针对WebServices协议的三种脚本开发模式

    一,webservices协议简介 webservices是建立可交互操作的分布式应用程序的新平台,它通过一系列的标准和协议来保证程序之间的动态连接, 其中最基本的协议包括soap,wsdl,uddi ...

  5. Loadrunner脚本开发-基于HTTP协议的流媒体视频在线播放服务器性能测试

    脚本开发-基于HTTP协议的流媒体视频在线播放服务器性能测试 by:授客 QQ:1033553122   目的 实现基于http协议的流媒体在线视频播放,服务器性能测试脚本,模拟用户浏览器方式在线播放 ...

  6. 【JMeter4.0学习(三)】之SoapUI创建WebService接口模拟服务端以及JMeter对SOAP协议性能测试脚本开发

    目录: 创建WebService接口模拟服务端 下载SoapUI 新建MathUtil.wsdl文件 创建一个SOAP项目 接口模拟服务端配置以及启动 JMeter对SOAP协议性能测试脚本开发 [阐 ...

  7. LR12中针对WebServices协议的三种脚本开发模式

    一,webservices协议简介 webservices是建立可交互操作的分布式应用程序的新平台,它通过一系列的标准和协议来保证程序之间的动态连接, 其中最基本的协议包括soap,wsdl,uddi ...

  8. Loadrunner 脚本开发-利用loadrunner开发Windows Sockets协议脚本

    脚本开发-利用loadrunner开发Windows Sockets协议脚本 by:授客 QQ:1033553122 欢迎加入软件性能测试交流QQ群:7156436 实践举例 Socket服务端简单实 ...

  9. 【JMeter4.0学习(二)】之搭建openLDAP在windows8.1上的安装配置以及JMeter对LDAP服务器的性能测试脚本开发

    目录: 概述 安装测试环境 安装过程 配置启动 配置搭建OpenLDAP 给数据库添加数据 测试查询刚刚插入的数据 客户端介绍 JMeter建立一个扩展LDAP服务器的性能测试脚本开发 附:LDAP学 ...

随机推荐

  1. 深入浅出NetWorking

    技术屌丝也是需要学习网络基本知识的,本书用一种轻松的方式讲了最基本的网络概念和硬件.协议,看完此书,就可以学习<TCP/IP协议>,学完后从此网络再无战事了. 1.网线分为:双绞线,同轴电 ...

  2. 自定义animate()引起的动画叠加

    当用户快速在某个元素多次执行动画时,会造成动画累积的现象.这时,就需要引入动画状态这个概念.判断元素是否处于动画状态中,如果处于,则不添加新动画 常常用于在设置动画之前未清除动画,造成的动画叠加.解决 ...

  3. Hello_Area_Description 任务三:Project Tango采集区域描述数据

    Permission Dialogs for Users in Java在Java中用户使用的权限对话框 Tango works by using visual cues from the devic ...

  4. 团体程序设计天梯赛L1-019 谁先倒 2017-03-22 17:35 33人阅读 评论(0) 收藏

    L1-019. 谁先倒 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳 ...

  5. handsontable-developer guide-data binding,data sources

    数据绑定: 1.表格中得数据是引用了数据源中的数据:表格中数据改变,数据源中得数据也改变:数据源中得数据改变,通过render方法,表格中的数据也改变: 2.如果想把数据源中的数据和表格中的数据分开: ...

  6. [label][webSites]一个结合Google地图的图片浏览网站

    内容中包含 base64string 图片造成字符过多,拒绝显示

  7. Android-自定义开关(ViewGroup版)

    虽然实现自定义开关,通常情况下都是继承View,比较合理方便快捷一些 但是我今天想去继承ViewGroup来实现自定义开关来玩玩 效果图: 布局代码: <!-- 自定义开关ViewGroup版 ...

  8. Hadoop 集群配置记录小结

    Hadoop集群配置往往按照网上教程就可以"配置成功",但是你自己在操作的时候会有很多奇奇怪怪的问题出现, 我在这里整理了一下常见的问题与处理方法: 1.配置/etc/hosts ...

  9. QPS的计算

    QPS = req/sec = 请求数/秒 Q:如何根据日志查看一个服务的qps A: 一般access.log是记录请求的日志,tail  -f XXX.access.log ,可发现格式如下: 前 ...

  10. asp.net——正则表达式

    在平时的开发中常常用到替换法:  普通的字符串替换可以使用string.replace(string,string),但是比较难解决HTML文本的替换. 经我几番查找,终也找出解决办法:正则匹配替换. ...