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引入以下依赖
<!-- JMeter依赖jar -->
<dependency>
    <groupId>org.apache.jmeter</groupId>
    <artifactId>ApacheJMeter_java</artifactId>
    <version>5.4</version>
</dependency>
<!-- http请求jar -->
<dependency>
    <groupId>apache-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>
  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;

/**
 * 通过继承AbstractJavaSamplerClient类来实现自定义jar实现的内容
 * @description: jmeter java请求
 **/

public class JMeterJavaRequest extends AbstractJavaSamplerClient {

    /**
     *
     * @param javaSamplerContext jmeter上下文内容,请求参数等
     * @return
     */
    @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. 执行请求查看结果树已获取到请求百度的响应内容了
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值