首页 > 其他分享 >jmeter插件开发—RocketMQ4.9

jmeter插件开发—RocketMQ4.9

时间:2024-07-03 19:30:27浏览次数:17  
标签:插件 context producer sr private params RocketMQ4.9 import jmeter

上期是使用java测试了rocketmq中间件的测试,考虑到后期性能测试,准备封装为jmeter插件。参考TesterHome的文章

环境说明

JDK1.8.0,Jmeter 5.4.3,maven构建工具(使用JDK17时遇到过跟Jmeter设置的外观有冲突)

实现代码(pom.xml已贴在上期的文章最后)

以下为全部代码,可以自行调整相关参数,实现了普通send与oneway(单向)的发送方式

package com.qgc.maven;

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 org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import com.alibaba.fastjson.JSONObject;
import java.io.UnsupportedEncodingException;


public class JmeterMqProducer extends AbstractJavaSamplerClient {
    //这里定义类变量(不能定义为static,会报错)
    private DefaultMQProducer producer;
    private String producerName;
    private String producerGroup;
    private String serverUrl;
    private String topic;
    private String tags;
    private String keys;
    private String body;
    private String delayTime;
    private String timeout;
    private String sendType;
    private long cur_time;
    private byte[] bodyBytes;
    private String orginData;
//    private final Logger log = LogManager.getLogger(JmeterMqProducer.class);

    //这里定义这里作为请求的前置处理
    @Override
    public void setupTest(JavaSamplerContext context) {
        serverUrl = context.getParameter("serverUrl");
        topic = context.getParameter("topic");
        tags = context.getParameter("tags");
        keys = context.getParameter("keys");
        body = context.getParameter("messageBody");
        bodyBytes = body.getBytes();
        producerName = context.getParameter("producerName");
        producerGroup = context.getParameter("producerGroup");
        timeout = context.getParameter("timeout");
        sendType = context.getParameter("sendType");
        delayTime = context.getParameter("delayTime");

        try {
            producer = getProducer(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    //这里自定义了一个Producer的单例方法
    public DefaultMQProducer getProducer(int type) throws InterruptedException {
        if (producer == null){
            producer = new DefaultMQProducer(producerName);
            if (type == 1){
                System.out.println("=======init producer =====");
                cur_time = System.currentTimeMillis();
            }else {
                System.out.println("=======runtest producer =====");
            }
            producer.setNamesrvAddr(serverUrl); //serverUrl
            // 设置超时时间
            producer.setSendMsgTimeout(Integer.parseInt(timeout));
        }
        try {
            producer.start();
        } catch (MQClientException e) {
            System.out.println("启动init!忽略");
        }
        return producer;
    }

    //这里是一个请求结束的后置处理
    @Override
    public void teardownTest(JavaSamplerContext context) {
        producer.shutdown();
    }

    //这里是一个请求主体执行部分
    @Override
    public SampleResult runTest(JavaSamplerContext context) {

        SampleResult sr = new SampleResult();
        sr.sampleStart();
        Message msg = null;
        try {
            msg = new Message(topic, tags, keys, body.getBytes(RemotingHelper.DEFAULT_CHARSET));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        try {
            JSONObject json = new JSONObject();
            json.put("serverUrl", serverUrl);
            json.put("sendType", sendType);
            json.put("topic", topic);
            json.put("tags", tags);
            json.put("keys", keys);
            json.put("producerName", producerName);
            sr.setRequestHeaders(json.toString());
            sr.setSamplerData(body);
            if ("oneWay".equals(sendType)){
                producer.sendOneway(msg);
                sr.setResponseData("{\"code\": \"200\", \"SendStatus\" : \"success\"}","utf-8");
            }else {
                SendResult sendResult = producer.send(msg);
                sr.setResponseData(sendResult.toString(),"utf-8");
                if(sendResult !=null || sendResult.getSendStatus() == SendStatus.SEND_OK){
                    sr.setResponseData("{\"code\": \"200\", \"SendStatus\" : \"" + sendResult.getSendStatus() + "\",\"MsgId\" : \"" + sendResult.getMsgId() +"\"}","utf-8");
                }
                else {
                    System.err.println(sendResult);
                    sr.setResponseData("{\"code\" : \"500\", \"msg\": \"失败\", \"Error\": \""+ sendResult.toString() +"\"}","utf-8");
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            sr.setResponseData("{\"code\" : \"501\", \"msg\": \"其他失败\", \"Error\": "+ e +"}","utf-8");
            producer.shutdown();

        }
        try {
            sr.setDataType(SampleResult.TEXT);
            sr.setSuccessful(true);
        }catch(Exception e){
            sr.setSuccessful(false);
            e.printStackTrace();
        }
        finally {
            sr.sampleEnd();
        }
        return sr;

    }

    // 给参数填充默认值
    @Override
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument("serverUrl", "18.162.xxx.xx:9876");
        params.addArgument("topic", "qgc_TopicTest");
        params.addArgument("tags", "qgc_TagA");
        params.addArgument("keys", "test_key");
        params.addArgument("messageBody", "test_body");
        params.addArgument("producerName", "test_producerName");
        params.addArgument("producerGroup", "producerGroup");
        params.addArgument("timeout", "6000");
        params.addArgument("sendType", "oneWay");
        params.addArgument("delayTime", "100");

        return params;
    }
}

插件准备

使用maven打包后,把jar包复制到apache-jmeter-5.4.3安装目录下\lib\ext。(因为把所有依赖包打入一个包失败了,下图是一个个在maven本地复制过来的)

Jmeter使用

jmeter重启后,应该在取样器中能看见java请求选项

 主界面如下图

 运行成功如下图

 查看rockermq的消息面板,验证成功

如果发送失败了,可以添加打印,在Jmeter的启动命令控制台进行调试

 

标签:插件,context,producer,sr,private,params,RocketMQ4.9,import,jmeter
From: https://www.cnblogs.com/qgc1995/p/18267737

相关文章

  • 真太卷了...又开源一款开放API管理工具,支持扩展插件(带私活源码)
     关于API管理工具,相信大家已经都有自己用着顺手的。像国外的Postman,国内有Apifox等等。今天给大家分享的是近期在GitHub比较热门的另一款开放API管理工具:Eoapi。1.Eoapi简介概括来说:这是一款API管理工具,支持扩展插件,简单,开源。Eoapi集合了基础的API管理功能和测试......
  • Jmeter使用CLI模式进行负载测试的注意点
    在我们打开Jmeter的时候,窗口会出现如下提示:这个提示的意思是,不要使用GUI模式进行负载测试:GUI模式主要用于创建和调试测试,而不是运行大规模的负载测试。​使用CLI模式进行负载测试:CLI模式(以前称为NONGUI模式)更适合进行负载测试,因为它能够更高效地使用系统资源,避免了G......
  • jmeter之CSV文件传参乱码
    1.使用xlsx文件设置参数进行传参,  2.请求之后解析为乱码,原因是xlsx文件编码格式不是UTF-8 解决方案1.文另存为CSVUTF-8格式 2.保存完成后选择对应文件传参 3.运行后解析正确,没有乱码 ......
  • 【全网唯一】aardio纯本地离线文字识别插件
    目的     aardio是一种用于Windows平台的脚本编程语言,以及一个功能丰富的集成开发环境(IDE)。它结合了强大的原生WindowsAPI访问能力和简单易学的语法。它属于易用性极强的动态语言,但也是一种混合语言,可以罕见地、非常方便地操作静态类型,因此可以直接调用C语言、C++......
  • 从零开始带你上手体验Sermant自定义插件开发
    本文分享自华为云社区《Sermant自定义插件开发上手体验》,作者:华为云开源。一、研究缘由由于目前我们所处的行业是汽车行业,项目上进行云服务的迁移时使用到了Sermant中的相关插件,为了加深对Sermant开发和运行机制的了解,我们从零开始体验Sermant自定义插件的开发。下面我们就Se......
  • ubuntu中gstreamer缺少rtspserversink插件怎么安装这个插件?
    在Ubuntu中,如果GStreamer缺少rtspserversink插件,这通常意味着gst-rtsp-server模块没有正确安装或配置。rtspserversink是gst-rtsp-server库的一部分,它用于构建RTSP服务器,支持媒体流的发送。以下是详细的安装步骤,这些步骤将帮助你安装gst-rtsp-server及其相关插件:首先,你需要安......
  • 数据分表——使用 Mybatis-Plus插件实现动态表名分表(按年份分表、按月份分表)
    本博客适合Mybatis-Plus3.4以上版本,笔者使用版本为3.5.3。分库与分表的原因1.业务场景:日志、交易流水表或者其他数据量大的表,通过日期进行了水平分表,需要通过日期参数,动态的查询数据。实现思路:利用MybatisPlus的动态表名插件DynamicTableNameInnerInterceptor,实现Sql执行......
  • Eplan插件 - 矩形修订云线
    前言在CAD中,矩形云线一直是设计师们用于标注修订区域或突出重要部分的得力工具。然而,在Eplan中,没有直接绘制矩形云线的功能。为了填补这一空白,开发了专门用于Eplan的矩形修订云线插件。这款插件保留了Eplan绘制的习惯,可以简洁快速的框选出需要修订或者重点关注的区域,使整个......
  • Temu有哪些选品技巧和方法?Temu选品助手插件
    对于电商来说,选品至关重要,正所谓“三分靠产品,七分靠选品”。好的选品就是那些具有市场竞争力的优质产品,能提升消费者的购物体验,也能帮助卖家实现销售增长和利润提升。今天小编来整理一下有关Temu平台的选品技巧和方法,觉得有用就点赞收藏哦!Temu有哪些选品技巧和方法?1、行业......
  • 关于 VuePress 的插件
    07.插件插件就好比第三方功能,例如增加一个阅读进度条、增加光标效果等。VuePress官网对插件的介绍:插件通常会为VuePress添加全局功能。这里简单介绍几个本站用的插件吧!‍‍插件就好比第三方功能,例如增加一个阅读进度条、增加光标效果等,VuePress官网对插件的介绍:插件通常......