消息队列(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 = 1428; // 发送端口号,相当于前置机的接收端口int CCSID = 1381; // 客户端Unix用819,windows用1381int OpenOptions = MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT|MQC.MQOO_INQUIRE; // 连接参数int PutDepth = 0; // 发送队列深度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 = 1381; // 设置字符集PutMessage.expiry = -1;    // 设置消息为不过期return 0;}//end of initpublic int action() throws Throwable{SndTime = String.valueOf(System.currentTimeMillis()); // 获取当前发送时间,13位lr.start_transaction("02_CP2I111_大额来帐_发送");PutQueueMessage("{H:" +"02" +"309391000011  " +"HVPS" +"306581000003  " +"HVPS" +"<Date>" + // 报文发起日期"<Time>" + // 报文发起时间"XML" +"hvps.111.001.01     " +SndTime + "<Num>" + // 通信级标识号,CNAPS2SIMU0000088212,20位,接收方根据OrigSender+OrigSendDate+MesgID唯一确定一个报文,该三项重复的报文作为通信级重复报文;SndTime + "<Num>" + // 通信级参考号,CNAPS2SIMU0000030415,20位,标识本报文的关联报文,由OrigSender设置,后续节点应保持该域不变,并在通信回应报文中带回该值,以便OrigSender匹配原报文;"3" +"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 0;}//end of actionpublic 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 0;}// 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 = 1428; // 接收端口号,相当于前置机的发送端口int CCSID = 1381; // 客户端Unix用819,windows用1381int OpenOptions = MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT|MQC.MQOO_INQUIRE; // 连接参数int GetDepth = 0; // 接收队列深度
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 = 1381;GetMessage.expiry = -1;GMO.waitInterval = 20000; // 等待时间限制GMO.options = MQC.MQGMO_NO_WAIT; // 如果队列没有消息则立即返回return 0;}//end of initpublic int action() throws Throwable{String Msg = null;String NowTime = null;try{GetMessage = new MQMessage(); // 必须新建实例,否则无法多次迭代无法继续接收消息GetDepth = GetQueue.getCurrentDepth(); // 获取接收队列的深度 if(GetDepth > 0) //接收队列深度不为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){// 2033是没有消息,不做处理
            }else{  lr.error_message("02_CP2I111_大额来帐_接收接收消息时出错,完成代码为:" + ex.completionCode + ",原因为:" + ex.reasonCode + ",流水号为:" + NowTime);ex.printStackTrace();}}catch(Exception e){e.printStackTrace();}return 0;}//end of actionpublic 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 0;}// end of end// 统计交易结果public void CompResult(String MSG, String RecTime){boolean Result = true; // 交易是否成功String StartTime = null;double DurTime = 0; // 交易处理时间int FlowIndex = -1; // 位置String FlowNo = null;int ErrIndex = -1; // 错误码位置String ErrCode = null;FlowIndex = MSG.indexOf("<MsgId>"); // 流水号的位置StartTime = MSG.substring(FlowIndex+7, FlowIndex+7+13); // 从流水号获取开始时间DurTime = (Double.parseDouble(RecTime) - Double.parseDouble(StartTime))/1000; // 单位秒//lr.error_message("======处理时间是:" + DurTime + "发送时间是:" + StartTime + "接收时间是:" + RecTime + "返回报文是:" + MSG);ErrIndex = MSG.indexOf("<MsgPrcCd>"); // 错误码的位置ErrCode = MSG.substring(ErrIndex+10, ErrIndex+10+8); // 错误码if(!ErrCode.equals("CU0I0000")) // 成功状态码是CU0I0000,交易失败则获取流水号
        {Result = false;FlowNo = MSG.substring(FlowIndex+7, FlowIndex+7+13); // 流水号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>

转载于:https://www.cnblogs.com/fy--/p/8966233.html

[性能测试]:关于MQ协议脚本开发相关推荐

  1. JMeter工具:常用协议脚本开发(BeanShell Sampler, Debug Sampler, FTP/Java/JDBC请求, JUnit request, SOAP/XML-RPC)

    目录 1. BeanShell Sampler 1.1 BeanShell Timer:BeanShell定时器 1.2 BeanShell PreProcessor:BeanShell前置处理器 1 ...

  2. jmeter web服务器协议,【JMeter4.0学习(三)】之SoapUI创建WebService接口模拟服务端以及JMeter测试SOAP协议性能测试脚本开发(示例代码)...

    目录: [阐述]:首先应该遇到了一个共同的问题,JMeter3.2之后就没有WebService(SOAP) Request,后来经过查询网上资料得知其实可以用HTTP请求来操作,结果是一样的. [步 ...

  3. jmeter的java测试框架_性能测试学习之路 (四)jmeter 脚本开发实战(JDBC JMS 接口脚本 轻量级接口自动化测试框架)...

    1.业务级脚本开发 登录脚本->思路:在线程组下新建两个HTTP请求,一个是完成访问登录页,一个是完成登录的数据提交. 步骤如下: 1) 访问登录页 2) 提交登录数据的HTTP PS:对于业务 ...

  4. 安卓三维展示源码_手机(安卓)自动化脚本开发线上培训

    7月份新增内容: 一.[autojs协议教程] 第一部分:HTTP教程 1.1.HTTP概念介绍1.2.HTTP消息结构1.3.HTTP请求方法1.4.HTTP请求方法1.5.HTTP状态码 第二部分 ...

  5. 学会Python就能做游戏脚本开发?别天真了!—— 关于游戏脚本的3个质疑

    现如今想从事和游戏相关的工作,例如游戏开发或游戏脚本策划的伙伴越来越多. 很多想从事脚本开发的伙伴有如下3点质疑: 1.学会Python就可以从事游戏脚本的工作吗? 2.脚本开发只需要学习Python ...

  6. 学会Python就能做游戏脚本开发?别天真了!

    现如今想从事和游戏相关的工作,例如游戏开发或游戏脚本策划的伙伴越来越多. 很多想从事脚本开发的伙伴有如下3点质疑: 1.学会Python就可以从事游戏脚本的工作吗? 2.脚本开发只需要学习Python ...

  7. [油猴脚本开发指南]脚本ajax的跨域请求

    转载自油猴中文网:bbs.tampermonkey.net.cn 李恒道QQ4548212 油猴中文网bbs.tampermonkey.net.cn TamperMonkey GreaseMonkey ...

  8. 软件测试 自动化测试 Web自动化测试01 selenium 定位元素方法 元素操作 自动化脚本开发

    文章目录 1 自动化测试概述 1.1 测试的目的 1.2 自动化测试的优点 1.3 自动化测试的缺点 1.4 自动化测试工具 1.5 自动化测试流程 2 selenium基础 2.1 selenium ...

  9. vim配置文件收集(作为c/c++和脚本开发的环境)

    vim配置文件收集(作为c/c++和脚本开发的环境) - StamHe的专栏 - 博客频道 - CSDN.NET vim配置文件收集(作为c/c++和脚本开发的环境) 分类: Linux系统配置 20 ...

最新文章

  1. @老板:别开视频会议了,效率低没人care,斯坦福、微软都可以作证
  2. .NET Framework- 反射特性序列化(Day4)
  3. Interview:算法岗位面试—上海某公司算法岗位(偏数据分析,互联网行业)技术面试考点之特征工程考察点
  4. Lind.DDD敏捷领域驱动框架~介绍
  5. 软件层面可以做到重启本地串口吗_手机关机还是重启好?get这几招,手机更流畅...
  6. 有效创建Oracle dblink的两种方式
  7. 安卓应用安全指南 六、困难问题
  8. 所有的计算机语言都必须进行多进制运算,2018职称计算机考试巩固练习及答案17...
  9. Python之基本数据类型set常用基本方法简述
  10. php排序函数实例学习教程
  11. SpringBoot使用thymefeal出现No mapping for GET /xxx的解决办法
  12. 1. 喵喵宠物管理系统需求分析
  13. 利用谷歌浏览器模拟网速慢的情况
  14. 阿里云国际版忘记会员名或登录密码,怎么办?
  15. 删除链表的节点(JS)
  16. 计算机怎么不读u盘,老司机告诉你电脑不读U盘的解决方法
  17. 老师发的周报写法,之前自己太随意没有规则了QAQ
  18. 谈谈数据决策平台搭建的必要性
  19. 在VMware 14虚拟机下,ndn-cxx和NFD平台搭建
  20. 猎人打猎(二)----利用继承

热门文章

  1. kFeedback开源啦
  2. superset可视化-桑基图(sankey diagram)
  3. SyntaxError: (hbase):100: syntax error, unexpected tIDENTIFIER
  4. fastdfs上传文件时报错No route to host
  5. TPU和GPU跑模型时间统计(持续更新中)以及TPU Research Cloud的申请
  6. theano中的Rop和Lop的详细解释
  7. CVP(Critical Value Pruning)illustration with clear principle in details
  8. C++Primer模板
  9. mysql如何获取句柄_关于获取进程句柄的问题
  10. c语言自动ejter,Skinnskalle eller ej, ingen ska behöva dö för sina åsikter