LR中MQ協議交易腳本介紹

MQ是IBM的消息中間件。

Loadrunner是不直接支持MQ協議,但是loadrunner是java vuser,所以我們可以通過Loadrunner中調用MQ提供的jar包,模擬實現對MQ進行消息傳輸的功能。


1.準備環境,jdk環境,MQ的jar包。

MQ的jar,當安裝MQ軟件後,在安裝目錄下有jar lib目錄,不知道要具體要用哪幾個包,就全部增加。


2.開始腳本開發

詳細腳本如下:


import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import com.ibm.mq.*;
import lrapi.lr;

public class Actions
{
String PutQueueManagerName = "QM_MBR_5500"; // 發送隊列管理器名稱,MQ服務器中隊列管理器
String PutQueueName = "REQ.5500.CBS.NNS"; // 發送隊列名,MQ應用取數據的隊列
String QueueChannel = "SVRCONN_MBR5500"; // 通道名,要用服務類型的通道
String HostName = "10.14.1.10"; // MQ服務的IP地址
int PutPort = 65400; // 發送端口,MQ服務器中監聽器的端口,
int CCSID = 1208; // 客戶端Unix用819,windows用1381
int OpenOptions = MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT|MQC.MQOO_INQUIRE; // 連接參數
int PutDepth = 0; // 發送隊列深度


MQQueueManager PutQueueManager = null; // 創建發送隊列管理器對象
MQQueue PutQueue = null; // 創建發送隊列對象
MQMessage PutMessage = null; // 創建發送消息對象
MQPutMessageOptions PMO = null; // 創建發送消息選項對象

public int init() throws Throwable
{
   // 發送隊列的參數**********************************************
   MQEnvironment.hostname = HostName; // 設置環境參數
   MQEnvironment.port = PutPort;
   MQEnvironment.CCSID = CCSID; 
   MQEnvironment.channel = QueueChannel;
   PutQueueManager = new MQQueueManager(PutQueueManagerName); // 連接發送隊列管理器

   PutQueue =PutQueueManager .accessQueue(queueName, openOptions); ; // 建立訪問發送隊列

    PutMessage =new MQMessage();

   PutMessage.format = MQC.MQFMT_STRING; // 設置消息中應用數據的格式
   PutMessage.characterSet = 1208; // 設置字符集

   PutMessage.expiry = -1;    // 設置消息爲不過期

   return 0;
}//end of init

public int action() throws Throwable

{

   lr.start_transaction("test");//設置開始事務

    string msgbody ="<?xml version=\"1.0\" encoding=\"UTF-8\"?><transaction>test</transaction>";//保存要發送報文

   PutQueueMessage(msgbody);

   //設置事務
   lr.end_transaction("test",lr.PASS);

   return 0;
}//end of action

public int end() throws Throwable
{
            try
   {
PutQueue.close(); //關閉隊列
PutQueueManager.close();//關閉隊列管理器
PutQueueManager.disconnect(); //斷開連接
   }
   catch (MQException ex)
   {
lr.error_message("測試,完成代碼爲:" + ex.completionCode + ",原因爲:" + ex.reasonCode);
ex.printStackTrace();
   }
   catch(Exception e)
   {
e.printStackTrace();
   }
   return 0;
}// end of end

// 發送消息
public void PutQueueMessage(String MyStr)
{
   try
   {
  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("test",lr.FAIL);
lr.error_message("test,完成代碼爲:" + ex.completionCode + ",原因爲:" + ex.reasonCode);
lr.exit(lr.EXIT_ITERATION_AND_CONTINUE, lr.FAIL);
   }
   catch(Exception e)
   {
e.printStackTrace();
   }
}
}


MQ協議通常是異步處理,所以此腳本中只發送MQ交易,不驗證返回結果,所以交易響應時間無法統計。但是統計響應時間的方法一般有如下兩種:從MQ日誌中提取響應時間和從應用數據庫中統計響應時間。

因此對應的開始時間和結束時間的統計可能有如下幾種方式,需要大家在實際項目中靈活使用。

響應時間的開始時間:

1)        消息進入壓力發起的MQ隊列中的時間

2)        消息從進入到應用系統的MQ隊列中時間

3)        應用系統從隊列中取出消息開始處理的時間

響應時間的結束時間:

1)        應用系統處理完數據的時間

2)        應用系統將消息放入MQ隊列的時間

對端MQ隊列接收到MQ消息的時間


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章