MQ是IBM的消息中間件。
Loadrunner是不直接支持MQ協議,但是loadrunner是java vuser,所以我們可以通過Loadrunner中調用MQ提供的jar包,模擬實現對MQ進行消息傳輸的功能。
1.準備環境,jdk環境,MQ的jar包。
MQ的jar,當安裝MQ軟件後,在安裝目錄下有jar lib目錄,不知道要具體要用哪幾個包,就全部增加。
2.開始腳本開發
詳細腳本如下:
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消息的時間