栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JMeter取样器中的Java请求底层实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JMeter取样器中的Java请求底层实现

一、前言

JMeter作为一款主流的性能框架,可以执行主流的:http压测、jdbc压测、tcp压测、dubbo协议压测,关于它支持的压测类型都是基于取样器去实现的,本文我们着重介绍java request取样器的底层实现

二、Java Request介绍
  • 取样器:java request ,本质是通过用户自定义的jar打入到JMeter /lib下的一个扩展jar,表面是使用JMeter引擎来执行压测,但是压测的内容是通过你自定义jar来实现的

FAQ:为何执行http请求用java request来做而不用,自带的http取样器来做?
答:由于通过java request来做,灵活性更高,自己通过代码来实现一些请求的前置依赖、自己根据现有业务特定的参数化等

三、Java Request运行原理
  1. 我们使用JMeter自带的java请求demo来断点去看看它的执行实现
  2. 创建一个java request请求

  1. 我们直接在JMeter源码找到JMeterThread类对应的doSampling方法,如图打个断点,这是JMeter执行压测必经之路

没看过我之前的文章可以参考这篇:JMeter engine启动原理

  1. 随后进入到JavaSampler下的sampler方法,处理内容如下
  2. 至此,JMeter的引擎就完成了,剩下的内容都交由自定义jar即JavaTest类来实现

在这里请注意JMeter提供的java request只是一个demo,实际并没有发出请求到外界,参数都是自己定义好的,然后return回去,若要实现真正的一个java request需要参考如下实践demo写法

四、自己手动实现Java Request
  1. 首先idea新建一个module,pom.xml引入以下依赖

    org.apache.jmeter
    ApacheJMeter_java
    5.4



    apache-httpclient
    commons-httpclient
    3.1

  1. 新建一个class类JMeterJavaRequest ,本demo仅供思路参考
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
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.io.IOException;



public class JMeterJavaRequest extends AbstractJavaSamplerClient {

    
    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
        long beginTime = System.currentTimeMillis();
        //sampleResult为JMeter需要接受的结果内容
        SampleResult sampleResult = new SampleResult();
		//定义一个http客户端对象
        HttpClient httpClient = new HttpClient();
        HostConfiguration hostConfiguration = new HostConfiguration();
        GetMethod getMethod = new GetMethod();
        getMethod.setRequestHeader("java","custom-java-test");
        hostConfiguration.setHost("www.baidu.com");
        try {
            //执行请求并获取状态吗
            int status = httpClient.executeMethod(hostConfiguration, getMethod);
            String responseBodyAsString = getMethod.getResponseBodyAsString();
            long responseContentLength = getMethod.getResponseContentLength();
            Header[] responseHeaders = getMethod.getResponseHeaders();
            for (Header header:responseHeaders){
                String name = header.getName();
                String value = header.getValue();
                sampleResult.setResponseHeaders(name);
                sampleResult.setResponseHeaders(value);
            }

            Header[] requestHeaders = getMethod.getRequestHeaders();
            for (Header header:requestHeaders){
                String name = header.getName();
                String value = header.getValue();
                sampleResult.setRequestHeaders(name);
                sampleResult.setRequestHeaders(value);
            }
            sampleResult.setResponseCodeOK();
            sampleResult.setResponseCode(String.valueOf(status));
            sampleResult.setAllThreads(10);
            sampleResult.setBytes(21312L);
            long endTime = System.currentTimeMillis();
            sampleResult.setConnectTime(endTime -beginTime);
            sampleResult.setEndTime(endTime);
            sampleResult.setTimeStamp(beginTime);
            sampleResult.setBodySize(responseContentLength);
            sampleResult.setResponseMessage(responseBodyAsString);
            sampleResult.setSuccessful(true);
            return sampleResult;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public void teardownTest(JavaSamplerContext context) {
        super.teardownTest(context);
    }

    @Override
    public Arguments getDefaultParameters() {
        return super.getDefaultParameters();
    }
}

  1. 写完通过maven打包生成java-sampler-study-1.0-SNAPSHOT.jar

  2. 将自定义jar打入到JMeter项目 /lib/ext目录下,启动JMeter,Java Request即可看到该类,选中即可

  1. 执行请求查看结果树已获取到请求百度的响应内容了
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/697721.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号