一、概述
        使用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. css 鼠标选中内容背景色

    ::selection { background: rgba(32, 178, 170, .6); color: #ffffff; } ::-moz-selection { background: r ...

  2. DNS隧道 iodns

    通过iodns这个工具也能搭建DNS隧道 iodns的优点: 对下行数据不进行编码,速度快 支持多平台 最大16个并发连接 强制密码设定 iodns创建的DNS隧道网段不能喝服务器,客户端同一网段,比 ...

  3. Appium1.6启动iOS真机

      前提:已经安装了Appium1.6版本,我这里用的是GUI版本   环境要求: 真机iOS9.3及以上 macOS 10.11或10.12 Xcode7及以上   安装步骤如下 第一步:iOS真机 ...

  4. 581. Shortest Unsorted Continuous Subarray

      Given an integer array, you need to find one continuous subarray that if you only sort this subarr ...

  5. HTTP协议之请求

    HTTP请求 组成 一个http请求通常由三个部分组成: 请求行(request line) 首部(header) 主体(body) 格式如下所示 <request-line><CR ...

  6. lucene笔记

    lucene全文检索 全文检索是计算机程序通过扫描文章中的每一个词, 对每一个词建立一个索引, 指明该词在文章中出现的次数和位置. 当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程

  7. vue使用全局element-ui组件

    安装loader模块: cnpm install style-loader -D cnpm install css-loader -D cnpm install file-loader -D   安装 ...

  8. 第二章 向量(d4)有序向量:二分查找(改进)

  9. PAT1135(红黑书的判定)

    There is a kind of balanced binary search tree named red-black tree in the data structure. It has th ...

  10. [转]Docker到底是什么?为什么它这么火?

    如果你是数据中心或云计算IT圈子的人,这一年多来应该一直在听到普通的容器.尤其是Docker,关于它们的新闻从未间断过.Docker1.0在今年6月发布后,声势更是达到了前所未有的程度. 动静之所以这 ...