jmeter创建自定义java sampler往IBM MQ中发送消息的步骤

最近做的一个项目需要往IBM的MQ队列中发送消息由于jmeter没有这种Sampler所以就自己动手打造一个,记录步骤

步骤为:

  1. 下载需要的jar包
  2. 新建一个Java项目
  3. 导入jar包
  4. 编写sampler代码
  5. 将项目导出成jar包
  6. 将jar包放入{jmeterhome}/lib/ext
  7. 打开jmeter GUI新建一个java 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

 

 

 
posted @ 2020-01-02 17:00  pengqiang  阅读(1965)  评论(5编辑  收藏  举报