一、概述
        使用Loadrunner对IBM MQ进行性能测试,需要用到java vuser以及java编码知识。此次先介绍什么是IBM MQ,然后java vuser的使用与配置细节,最后介绍IBM MQ的测试脚本。
二、IBM MQ介绍
        IBM MQ(IBM Message Queue)是IBM的一款商业消息中间产品,适用于分布式计算环境或异构系统之中。消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。
        通过消息队列应用程序可独立地执行,它们不需要知道彼此的位或在继续执行前不需要等待接收程序接收此消息。
 
对列管理器
        队列管理器是MQ系统中最上层的一个概念,由它为我们提供基于队列的消息服务。
 
对列
        队列是消息的安全存放地,队列存储消息直到它被应用程序处理。
 
通道

通道是MQ系统中队列管理器之间传递消息的管道,它是建立在物理的网络连接之上的一个逻辑概念,也是MQ产品的精华。

        在 MQ中,主要有三大类通道类型,即消息通道,MQI通道和Cluster通道。
        消息通道是用于在MQ的服务器和服务器之间传输消息的,需要强调指出的是, 该通道是单向的,它又有发送(sender), 接收(receive), 请求者(requestor), 服务者(server)等不同类型,供用户在不同情况下使用。
        MQI通道是MQ Client和MQ Server之间通讯和传输消息用的,与消息通道不同,它的传输是双向的。
        群集(Cluster)通道是位于同一个MQ 群集内部的队列管理器之间通讯使用的。
 
消息
        在MQ中,我们把应用程序交由MQ传输的数据定义为消息,我们可以定义消息的内容并对消息进行广义的理解,比如:用户的各种类型的数据文件,某个应用向其 它应用发出的处理请求等都可以作为消息。消息有两部分组成:消息描述符(Message Discription或Message Header),描述消息的特征,如:消息的优先级、生命周期、消息Id等;消 息体(Message Body),即用户数据部分。在MQ中,消息分为两种类型,非永久性(non-persistent)消息和永久性(persistent)消息,非永久 性消息是存储在内存中的,它是为了提高性能而设计的,当系统掉电或MQ队列管理器重新启动时,将不可恢复。当用户对消息的可靠性要求不高,而侧重系统的性 能表现时,可以采用该种类型的消息,如:当发布股票信息时,由于股票信息是不断更新的,我们可能每若干秒就会发布一次,新的消息会不断覆盖旧的消息。永久 性消息是存储在硬盘上,并且纪录数据日志的,它具有高可靠性,在网络和系统发生故障等情况下都能确保消息不丢、不重。
        此外,在MQ中,还有逻辑消息和物理消息的概念。利用逻辑消息和物理消息,我们可以将大消息进行分段处理,也可以将若干个本身完整的消息在应用逻辑上归为一组进行处理。
三、Loadrunner java vuser的使用与配置
 

准备

        loadrunner 11
        jdk 1.6(32位)
        所需jar包名、下载地址:http://download.csdn.net/detail/macau2008/2117657(如有变更请自行搜索)
        com.ibm.mq.jar
        connector.jar     

com.ibm.mq.jmqi.jar     
        com.ibm.mq.headers.jar
        com.ibm.mq.commonservices.jar


创建
        打开loadrunner选择新建Java Vuser,如下图所示:
       
 
配置
        开启Run-time Setting,导入之前准备好的jar,如下图所示:
       
        
        配置Java VM,先选中红框所示单选框,然后输入本机所安装JDK位置,如下图所示:
       
 
四、测试脚本
        以下为MQ发送测试脚本,利用此脚本只用根据相应测试需求,调整注释部分:
 
/*
 * LoadRunner Java script. (Build: _build_number_)
 *
 * Script Description: simple test harness to PUT messages on a MQ queue
 *
 */
 
import lrapi.lr;
import com.ibm.mq.*;
import java.util.HashMap;
import java.util.Random;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class Actions
{
    // 队列管理器
    String queueMgrName = "QMCCPS01";
    // 队列名
    String putQueueName = "CNAPS_BPH";
    // 通道名
    String channel = "SYSTEM.DEF.SVRCONN";
    // 消息
    String msgBody = "";
    // ip 地址
    String hostname = "10.40.2.16";
    // 端口号
    int port = 1601;
    // 字符集
    int CCSID = 819;
 
 MQQueueManager queueMgr = null;
 MQQueue getQueue = null;
 MQQueue putQueue = null;
 MQPutMessageOptions pmo = new MQPutMessageOptions();
 MQGetMessageOptions gmo = new MQGetMessageOptions();
 MQMessage requestMsg = new MQMessage();
 MQMessage responseMsg = new MQMessage();
 
 // ?????????
 public int init() throws Throwable{
  // Open a connection to the queue manager and the put/get queues
  try {
   // As values set in the MQEnvironment class take effect when the
   // MQQueueManager constructor is called, you must set the values
   // in the MQEnvironment class before you construct an MQQueueManager
   // object.
   MQEnvironment.hostname=hostname;
   MQEnvironment.port=port;
   MQEnvironment.CCSID =CCSID;
   MQEnvironment.properties.put("transport", "MQSeries");
   // MQEnvironment.channel = "SYSTEM.DEF.SVRCONN";
   MQEnvironment.channel = channel;
   queueMgr = new MQQueueManager(queueMgrName);
 
   // Access the put/get queues. Note the open options used.
   putQueue = queueMgr.accessQueue(putQueueName, 49);
   // getQueue= queueMgr.accessQueue(getQueueName,
   // MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return 0;
 }
 
 public int action() throws Throwable{
  // This is an XML message that will be put on the queue. Could do some
  // fancy
  // things with XML classes here if necessary.
  // The message string can contain {parameters} if lr.eval_string() is
  // used.
  // Clear the message objects on each iteration.
  requestMsg.clearMessage();
  responseMsg.clearMessage();
                //读取报文内容,并利用replace函数参数化报文编号
                String req = read("G:\\大额贷记来账.xml");
                String data_msg = "<data_msg>";
                String msgBody = req.replace("<MsgId>2010101000000000</MsgId>", "<MsgId>20200117" + data_msg + "</MsgId>");
  // Create a message object and put it on the request queue
 
  try {
   pmo.options = MQC.MQPMO_NEW_MSG_ID; // The queue manager replaces
   // the contents of the MsgId
   // field in MQMD with a new
   // message identifier.
   // should be put on this queue 
   requestMsg.report = MQC.MQRO_PASS_MSG_ID; // If a report or reply is
   // generated as a result
   // of this message, the
   // MsgId of this message
   // is copied to the
   // MsgId of the report
   // or reply message.
   requestMsg.format = MQC.MQFMT_STRING; // Set message format. The
             // application message data
             // can be either an SBCS
             // string (single-byte
             // character set), or a DBCS
             // string (double-byte
             // character set).
   // requestMsg.messageType=MQC.MQMT_REQUEST; // The message is one
   // that requires a reply.
                        lr.start_transaction("大额贷记来账");
   requestMsg.writeString(msgBody); // message payload
   MQMessage inMsg = new MQMessage();
   inMsg.write(msgBody.getBytes("UTF-8"));
   putQueue.put(inMsg,pmo);
                        lr.end_transaction("大额贷记来账",lr.PASS );
 
  } catch (Exception e) { 
   e.printStackTrace();
  }
 
  /***
   * // Get the response message object from the response queue try {
   * responseMsg.correlationId = requestMsg.messageId; // The Id to be
   * matched against when getting a message from a queue
   * gmo.matchOptions=MQC.MQMO_MATCH_CORREL_ID; // The message to be
   * retrieved must have a correlation identifier that matches the value
   * of the CorrelId field in the MsgDesc parameter of the MQGET call.
   * gmo.options=MQC.MQGMO_WAIT; // The application waits until a suitable
   * message arrives. gmo.waitInterval=60000; // timeout in ms
   * getQueue.get(responseMsg, gmo);
   *
   * // Check the message content byte[] responseMsgData =
   * responseMsg.readStringOfByteLength
   * (responseMsg.getTotalMessageLength()).getBytes(); String msg = new
   * String(responseMsgData); lr.output_message(msg); // for debugging.
   * Disable this for a load test. // TODO: add your own message checking
   * here using string functions. // I have found that extracting XML
   * fields and comparing them (rather than // comparing the whole message
   * body or substrings) is more resistant to change. // If no match is
   * found, then lr.error_message() and lr.exit(). } catch(Exception e) {
   * e.printStackTrace(); lr.error_message("Error receiving message.");
   * lr.exit(lr.EXIT_VUSER, lr.FAIL); }
   *
   * lr.end_transaction("test_message", lr.AUTO);
   */
  return 0;
 }// end of action
 
 // ???????
 public int end() throws Throwable{
  // Close all the connections
  try {
   putQueue.close();
   // getQueue.close();
   queueMgr.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
  return 0;
 }// end of end
 
 
        public static String read(String fileName){
     String req = "";
     FileInputStream in = null;
     try {
  in = new FileInputStream(fileName);
  int len = in.available();
  byte[] b = new byte[len];
  in.read(b);
  req = new String(b);
  in.close();
     } catch (IOException e) {
  e.printStackTrace();
     }
     return req;
 }
}
 
 

使用Loadrunner对IBM MQ进行性能测试的更多相关文章

  1. IBM MQ消息中间件jms消息中RHF2消息头的处理

    公司的技术平台在和某券商对接IBM MQ消息中间件时,发送到MQ中的消息多出了消息头信息:RHF2,造成消息的接收处理不正常.在此记录此问题的处理方式. 在IBM MQ中提供了一个参数 targetC ...

  2. IBM Mq Spring JMS 的xml配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  3. IBM MQ 使用指南

    一.MQ基本操作 MQ中有几个很重要的组件:队列管理器(QueueManager).队列(Queue)和通道(Channel).其基本的操作方法如下:  1)创建队列管理器 crtmqm –q QMg ...

  4. (转)IBM mq基本使用

    一.下载7.5 Trial版本 http://www.ibm.com/developerworks/downloads/ws/wmq/ 这是下载网址,下载前先必须注册IBM ID,下载完成后一路Nex ...

  5. SUSE_LINUX 11 SP3 安装 IBM MQ 7.5

    0.环境介绍 mq7.5 suse linux 11 1. 上传安装包 上传安装包到 softWare/CI79IML.tar.gz 2. 安装证书 sh ./mqlicense.sh 输入 1 同意 ...

  6. IBM MQ 集成CXF 发送JMS 消息

    0.POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  7. IBM MQ相关 ---- 系列文章

    原 IBM websphere MQ远程队列的简单配置 转 MQ7.5以后的权限问题解决 原 MQ--API总结 转 连接IBM MQ原因码报2035的错误解决办法 原 Java连接MQ的实例 转 通 ...

  8. 用IBM MQ中间件开发碰到的MQRC_NOT_AUTHORIZED(2035)问题

    我在一台工作站上面部署了MQ服务器,在MQ服务器中我建立了队列管理器MQ_TEST,在该队列管理器中我建立了一个本地队列MQ_Q以及一个服务器连接通道MQ_C,MQ_C中的MCA用户标识默认为空.同时 ...

  9. IBM MQ + WebSphere + Spring JMS配置方法

    IBM MQ + WebSphere + Spring JMS配置方法  首先要在WAS里面配置IBM MQ作为JMS消息的提供者,在WAS管理控制台: Resources->JMS Provi ...

随机推荐

  1. JS----事件3

    一 事件对象(event):与特定事件相关且包含有关该事件详细信息的对象通过事件可以触发event对象的元素,鼠标的位置及状态,按下的键等等event对象只在事件发生的过程中才有效非IE浏览器里的ev ...

  2. php输出textarea数据(入库没有处理的)

    str_replace("\r\n","<br />",$xmactivity['xmdetail']) 导出excel换行方法 str_repla ...

  3. 大数据入门到精通1--大数据环境下的基础文件HDFS 操作

    1.使用hdfs用户或者hadoop用户登录 2.在linux shell下执行命令 hadoop fs -put '本地文件名' hadoop fs - put '/home/hdfs/sample ...

  4. 找回密码的url分析

    https://www.example.com/reset?email=user@example.com&key=b4c9a289323b21a01c3e940f150eb9b8c542587 ...

  5. sqlserver 死锁相关

    参考 https://www.cnblogs.com/fuyuanming/p/5783421.html -- 查询死锁 select request_session_id spid, OBJECT_ ...

  6. 截图软件FastStone

    屏幕截图软件(FastStone Capture) 好用,可以粘贴 / 复制. 可以做页面设计,有屏幕标尺,取色器.

  7. Shell的18条常用命令整理

    1.   ls: 类似于dos下的dir命令 ls最常用的参数有三个: -a -l -F. ls –a Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除 ...

  8. SoundChannel和soundTransform的关系

    SoundChannel 音乐的  播放  暂停  当前获取当前位置  长度 leftPeak : Number[只读] 左声道的当前幅度(音量),范围从 0(静音)至 1(最大幅度) rightPe ...

  9. Docker基础入门

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  10. HDU-1459.非常可乐(BFS )

    这道题TLE了很多次,原来一直以为将数字化为最简可以让运算更快,但是去了简化之后才发现,真正耗时的就是化简....还和队友学到了用状态少直接数组模拟刚就能过... 本题大意:给出可乐的体积v1,给出两 ...