最近做的一个项目需要往IBM的MQ队列中发送消息由于jmeter没有这种Sampler所以就自己动手打造一个,记录步骤
步骤为:
以下为详细步骤说明
1. 下载IBM MQ jar包,地址:https://repo1.maven.org/maven2/com/ibm/mq/com.ibm.mq.allclient/9.1.4.0/
还需要jmeter的jar包可在{jmeterhome}/lib/ext中找到
2.新建java项目一直下一步就行
3.点击file->project Structure将需要的包都导入
4.新建一个Java类继承 AbstractJavaSamplerClient 直接看源码吧
package com.ms.ibmmqsampler; import com.ibm.mq.*; import com.ibm.mq.constants.CMQC; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; import java.util.Arrays; import java.util.Properties; public class SendMsg extends AbstractJavaSamplerClient { private static final int CCSID = 1208; private static MQQueueManager qMgr; private static String queueString; /** * 通过getDefaultParameters()定义入参 */ @Override public Arguments getDefaultParameters() { //定义属性对象,用来添加GUI参数 Arguments params = new Arguments(); //添加一个GUI参数,名称叫"method",值是"add" params.addArgument("hostname", "127.0.0.1"); params.addArgument("port", "1819"); params.addArgument("userID", "mqm"); params.addArgument("password", "mqm"); params.addArgument("channel", "SYSTEM.DEF.SVRCONN"); params.addArgument("CCSID", "1208"); params.addArgument("queueString", "RECV.QUEUE"); params.addArgument("QueueManagerName", "QM1"); return params; } //每个线程测试前执行一次,做一些初始化工作; @Override public void setupTest(JavaSamplerContext arg0) { Properties props = new Properties(); props.put("hostname", arg0.getParameter("hostname")); props.put("port", arg0.getParameter("port")); props.put("channel", arg0.getParameter("channel")); props.put("CCSID", arg0.getParameter("CCSID")); props.put("userID", arg0.getParameter("userID")); props.put("password", arg0.getParameter("password")); queueString = arg0.getParameter("queueString"); try { qMgr = new MQQueueManager(arg0.getParameter("QueueManagerName"), props); } catch (MQException e) { e.printStackTrace(); } } //JavaSampleContext arg0()就是用来接收GUI所提交的 @Override public SampleResult runTest(JavaSamplerContext arg0) { // TODO Auto-generated method stub SampleResult sr = new SampleResult(); try { //将GUI界面传递过来的值赋给全局变量 // method = arg0.getParameter("method"); // x = Integer.parseInt(arg0.getParameter("num1", null)); // y = Integer.parseInt(arg0.getParameter("num2", null)); //是表示请求开始计时 sr.sampleStart(); //实际测试不需要,模拟处理过程中所需消耗的时间 // Random rnd = new Random(); // Thread.sleep(rnd.nextInt(1000)); //通过GUI传递的method参数来决定所执行的方法 //qMgr = new MQQueueManager("QM1"); byte[] b = hexStringToBytes("39303031303330353230313930333133313931343539313833303133373932343820202020202020202031303030303030303030303030304334323138373130303030303030353930202020202020202000202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202030323130F23E40818EC0801000000000100000013136343231383731303030303030303030303035393030303030303030303030313030303033313331393135313430363532353931353230333630333137303030302020202037303131303030383033303530303031303830303031303334343033303930303030373232383539373831333030313233343536373831323334353637383930313233343531536303330303030303032303030333030303020202020202020202020202020343030303830333035303030314544414642413736"); System.out.println("senMsg: " + Arrays.toString(b)); sendMsg(b); // receiveMsg(); // if (method.equals("add")) { // resultData = String.valueOf(c.add(x, y)); // } else if (method.equals("minus")) { // resultData = String.valueOf(c.minus(x, y)); // } // if (resultData != null && resultData.length() > 0) { //设置响应数据为resutlData;也可以用sr.setSamplerData("OK"); sr.setResponseData(Arrays.toString(b), null); //设置响应代码为0000 sr.setResponseCode("0000"); //设置响应类型为text sr.setContentType(SampleResult.TEXT); //设置响应状态为true sr.setSuccessful(true); //设置响应信息 sr.setResponseMessage("方法执行成功!"); // } else { // sr.setResponseData(resultData, null); // //设置响应代码为-9999 // sr.setResponseCode("-9999"); // //设置响应类型为txt // sr.setContentType(SampleResult.TEXT); // //设置响应状态为true // sr.setSuccessful(false); // //设置响应信息 // sr.setResponseMessage("方法执行失败!"); // } } catch (Exception e) { sr.setResponseData(e.getMessage(), null); e.printStackTrace(); sr.setResponseCode("-1"); sr.setContentType(SampleResult.TEXT); sr.setSuccessful(false); sr.setResponseMessage("捕获异常!"); } finally { //表示请求结束计时 sr.sampleEnd(); } //表示返回这个SampleResult对象sr return sr; } @Override public void teardownTest(JavaSamplerContext arg0) { // System.out.println(end); // System.out.println("The cost is"+(end-start)/1000); } private static void sendMsg(byte[] b) { int openOptions = CMQC.MQOO_INPUT_AS_Q_DEF | CMQC.MQOO_OUTPUT | CMQC.MQOO_INQUIRE; MQQueue queue = null; try { queue = qMgr.accessQueue(queueString, openOptions, null, null, null); MQMessage msg = new MQMessage(); msg.characterSet = CCSID; msg.encoding = CCSID; msg.write(b); MQPutMessageOptions pmo = new MQPutMessageOptions(); msg.expiry = -1; queue.put(msg, pmo); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (queue != null) { try { queue.close(); } catch (MQException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } private void sendTopic() { try { MQEnvironment.properties.put(CMQC.TRANSPORT_PROPERTY, CMQC.TRANSPORT_MQSERIES); MQTopic topic = qMgr.accessTopic("TOPIC_xx_2", "TOPIC_xx_2", CMQC.MQTOPIC_OPEN_AS_PUBLICATION, CMQC.MQOO_OUTPUT); MQPutMessageOptions option = new MQPutMessageOptions(); option.options = CMQC.MQPMO_FAIL_IF_QUIESCING | CMQC.MQPMO_RETAIN; ; MQMessage msg = new MQMessage(); msg.expiry = 5 * 60 * 1000; msg.writeObject("test"); msg.setStringProperty("test", "1"); topic.put(msg, option); qMgr.commit(); } catch (Exception e) { System.out.println(e); } } private void receiveTopic() { try { MQEnvironment.properties.put(CMQC.TRANSPORT_PROPERTY, CMQC.TRANSPORT_MQSERIES); MQTopic topic = qMgr.accessTopic("TOPIC_xx_2", "TOPIC_xx_2", CMQC.MQTOPIC_OPEN_AS_SUBSCRIPTION, CMQC.MQSO_CREATE); MQMessage msg = new MQMessage(); MQGetMessageOptions option = new MQGetMessageOptions(); topic.get(msg, option); qMgr.commit(); System.out.println(msg.getStringProperty("test")); } catch (Exception e) { System.out.println(e); } } private static void receiveMsg() { int openOptions = CMQC.MQOO_INPUT_AS_Q_DEF | CMQC.MQOO_OUTPUT | CMQC.MQOO_INQUIRE; MQQueue queue = null; try { queue = qMgr.accessQueue(queueString, openOptions, null, null, null); System.out.println("CurrentDepth: " + queue.getCurrentDepth()); System.out.println("==========================="); int depth = queue.getCurrentDepth(); while (depth-- > 0) { MQMessage msg = new MQMessage(); MQGetMessageOptions gmo = new MQGetMessageOptions(); queue.get(msg, gmo); System.out.println("DataLength: " + msg.getDataLength()); byte[] rawData = new byte[msg.getMessageLength()]; msg.readFully(rawData); String msgs = printHexString(rawData); System.out.println(Arrays.toString(rawData)); System.out.println(msgs); System.out.println("---------------------------"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (queue != null) { try { queue.close(); } catch (MQException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } private static byte[] hexStringToBytes(String hexString) { if (hexString == null || hexString.equals("")) { return null; } hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] d = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return d; } private static byte charToByte(char c) { return (byte) "0123456789ABCDEF".indexOf(c); } private static String bytesToHexString(byte[] src) { StringBuilder stringb = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringb.append(0); } stringb.append(hv); } return stringb.toString(); } private static String printHexString(byte[] b) { String a = ""; for (int i = 0; i < b.length; i++) { String hex = Integer.toHexString(b[i] & 0xFF); if (hex.length() == 1) { hex = "0" + hex; } a = a + hex; } return a; } // public static void main(String[] args) { //// // 设置参数,并赋予默认值1 //// params.addArgument("num1", "1"); //// params.addArgument("num2", "2"); // SendMsg test = new SendMsg(); // Arguments params = test.getDefaultParameters(); // JavaSamplerContext arg0 = new JavaSamplerContext(params); // test.setupTest(arg0); // test.runTest(arg0); // test.teardownTest(arg0); // } }
5.将项目导出成jar包 点击file->project Structure选择Artifacts
将jar包放入{jmeterhome}/lib/ext后打开jmeter
jmeter创建自定义java sampler往IBM MQ中发送消息的步骤
原文:https://www.cnblogs.com/pq628/p/12133955.html