要想通过自定义java请求来压测ZooKeeper,那么我们就需要做两件事情,第一我们需要知道java如何操作ZooKeeper,第二就是怎么能将我们写的jar包让jmeter识别,首先我们先来干第一件事。

一、java操作ZooKeeper

以下的代码是网上百度找到的,经过了一点点修改(对于测试其它的可以找其它的测试代码)

package com.comtop.ZookApi;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper; /**
* Zookeeper base学习笔记
*/
public class ZookeeperBase { /** zookeeper地址 */
static final String CONNECT_ADDR = "10.10.3.136:32372";
/** session超时时间 */
static final int SESSION_OUTTIME = 2000;// ms
/** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */
static final CountDownLatch connectedSemaphore = new CountDownLatch(1); public static void main(String[] args) throws Exception { ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME,
new Watcher() {
public void process(WatchedEvent event) {
// 获取事件的状态
KeeperState keeperState = event.getState();
EventType eventType = event.getType();
// 如果是建立连接
if (KeeperState.SyncConnected == keeperState) {
if (EventType.None == eventType) {
// 如果建立连接成功,则发送信号量,让后续阻塞程序向下执行
System.out.println("zk 建立连接");
connectedSemaphore.countDown();
}
}
}
}); // 进行阻塞
connectedSemaphore.await(); System.out.println("..");
// 创建父节点
// zk.create("/testRoot", "testRoot".getBytes(), Ids.OPEN_ACL_UNSAFE,
// CreateMode.PERSISTENT); // 创建子节点
// zk.create("/testRoot/children", "children data".getBytes(),
// Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 获取节点洗信息
// byte[] data = zk.getData("/testRoot/children", false, null);
// System.out.println(new String(data));
// System.out.println(zk.getChildren("/testRoot", false));
// 修改节点的值
// zk.setData("/testRoot/children", "modify data root".getBytes(), -1);
// byte[] data = zk.getData("/testRoot/children", false, null);
// System.out.println(new String(data));
// 如果存在节点则删除节点
if (null != zk.exists("/testRoot/children", false)) {
// 删除节点
zk.delete("/testRoot/children", -1);
System.out.println(zk.exists("/testRoot/children", false));
}
zk.close(); } }

二、自定义java请求

一、环境准备
        1、新建一个java工程
        2、导入jar包:ApacheJMeter_core.jar     ApacheJMeter_java.jar    (该包在本地C:\apache-jmeter-3.0\lib\ext下,当然路径取决于本地环境)
                这两个jar是使用jmeter最基础的jar,能够让你的代码在jmeter中运行起来,如果在写代码的过程中需要其他的jar,自行导入。
 
二、写代码前该知道的
        1、如果想要让你的代码在jmeter中运行起来,在创建类的时候需要去继承AbstractJavaSamplerClient抽象类或者是实现JavaSamplerClient接口
            AbstractJavaSamplerClient抽象类是JavaSamplerClient接口的子类,当你不需要复写所有的需要复写的方法时,那么你只需要去继承AbstractJavaSamplerClient抽象类即可。
 
            如果你选择了实现JavaSamplerClient接口,那么你需要复写的方法有:
                         public SampleResult runTest(JavaSamplerContext context) {}
                         public void setupTest(JavaSamplerContext context) {}
                         public void teardownTest(JavaSamplerContext context) {}
                         public Arguments getDefaultParameters() {}
            这4个方法就必须要复写,但是如果选择继承AbstractJavaSamplerClient这个抽象类,那么只需要复写你需要的方法即可。
 
        2、方法说明:
                    public Arguments getDefaultParameters() {}
                            这个方法由Jmeter在进行添加javaRequest时第一个运行,它决定了你要在GUI中默认显示出哪些属性。
                    public void setupTest(JavaSamplerContext context) {}
                            这个方法相当于loadrunner中的init,我们可以用它来进行一些初始化的动作。
                    public SampleResult runTest(JavaSamplerContext context) {}
                            这个方法相当于loadrunner中的action,我们的核心测试代码就在这里了。
                    public void teardownTest(JavaSamplerContext context) {}
                            这个方法相当于loadrunner中的end,收尾的工作可以由它来做。
 
        3、除了以上2点,我们一般还需要去实现Serializable,序列化标记接口,这样可以让我们的类去实现序列化。
 
整体代码如下:
package com.comtop.ZkApiJM;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection; 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.concurrent.CountDownLatch; import javax.management.RuntimeErrorException; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper.States;
import org.apache.zookeeper.ZooKeeper; //public Arguments getDefaultParameters();设置可用参数及的默认值;
//public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
//public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;
//public void teardownTest(JavaSamplerContext arg0):测试结束时调用; public class ZkjavaRequest extends AbstractJavaSamplerClient implements Serializable { /** zookeeper地址 */
private String conn_addr; //存储用户输入的zk地址
// 测试用的数据
// private static String conn_addr1;
// private static String session_timeout1;
// private static String zk_father1;
// private static String zk_children1;
// private static String zk_context1;
// private static String resultData1; private static final String ConnAddrName="conn_addr" ; //设置GUI页面显示的变量名称
//设置GUI页面默认显示的变量值,默认值为空
private static final String ConnAddrValueDefault="10.10.3.136:32372"; /** session超时时间 */
private String session_timeout; //存储用户输入的session超时时间(单位ms) private static final String SessTimeName="session_timeout" ; //设置GUI页面显示的变量名称
//设置GUI页面默认显示的变量值,默认值为空
private static final String SessTimeValueDefault="5000"; //zk父节点
private String zk_father = "test"; //存储用户输入的zk父节点
private static final String ZkFatherName="zk_father" ; //设置GUI页面显示的变量名称
//设置GUI页面默认显示的变量值,默认值为空
private static final String ZkFatherValueDefault="/test"; /** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */
static final CountDownLatch connectedSemaphore = new CountDownLatch(1); //zk连接对象
private ZooKeeper zk; // resultData变量用来存储响应的数据,目的是显示到查看结果树中。
private String resultData; // 测试代码
// public static void main(String[] args) {
// haha();
// }
//
// public static void haha(){
// conn_addr1 = "10.10.3.136:32372";
// session_timeout1 = "2000";
// zk_father1 = "/test1";
// zk_children1 = "/test2";
// zk_context1 = "test2";
// try {
// ZooKeeper zk = new ZooKeeper(conn_addr1, Integer.valueOf(session_timeout1),
// new Watcher() {
// public void process(WatchedEvent event) {
// // 获取事件的状态
// KeeperState keeperState = event.getState();
// EventType eventType = event.getType();
// // 如果是建立连接
// if (KeeperState.SyncConnected == keeperState) {
// if (EventType.None == eventType) {
// // 如果建立连接成功,则发送信号量,让后续阻塞程序向下执行
// System.out.println("zk 建立连接");
// connectedSemaphore.countDown();
// }
// }
// }
// });
// connectedSemaphore.await();
// // 如果存在父节点则不创建父节点
// if (null == zk.exists(zk_father1, false)) {
// // 创建父节点
// zk.create(zk_father1, zk_father1.getBytes(), Ids.OPEN_ACL_UNSAFE,
// CreateMode.PERSISTENT);
// }
// // 创建子节点
// zk.create(zk_father1+zk_children1, zk_context1.getBytes(),
// Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// // 获取节点洗信息
// byte[] data = zk.getData(zk_father1+zk_children1, false, null);
// resultData1 = new String(data);
// System.out.println(new String(data));
// System.out.println(zk.getChildren("/testRoot", false));
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
//
//} /*
* 这个方法用来控制显示在GUI页面的属性,由用户来进行设置。
* 此方法不用调用,是一个与生命周期相关的方法,类加载则运行。
* (non-Javadoc)
* @see org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient#getDefaultParameters()
*/ @Override
public Arguments getDefaultParameters() {
System.out.println("读取属性值");
Arguments params = new Arguments();
params.addArgument("conn_addr",String.valueOf(ConnAddrValueDefault));
params.addArgument("session_timeout", String.valueOf(SessTimeValueDefault));
params.addArgument("zk_father", String.valueOf(ZkFatherValueDefault));
params.addArgument("zk_children","");
params.addArgument("zk_context","");
return params;
} /**
* 初始化方法,初始化性能测试时的每个线程
* 实际运行时每个线程仅执行一次,在测试方法运行前执行,类似于LoadRunner中的init方法
*/ @Override
public void setupTest(JavaSamplerContext jsc) {
conn_addr = jsc.getParameter(ConnAddrName, ConnAddrValueDefault);
session_timeout = jsc.getParameter(SessTimeName, SessTimeValueDefault);
zk_father = jsc.getParameter(ZkFatherName, ZkFatherValueDefault);
try {
zk = new ZooKeeper(conn_addr, Integer.valueOf(session_timeout),
new Watcher() {
public void process(WatchedEvent event) {
// 获取事件的状态
KeeperState keeperState = event.getState();
EventType eventType = event.getType();
// 如果是建立连接
if (KeeperState.SyncConnected == keeperState) {
if (EventType.None == eventType) {
// 如果建立连接成功,则发送信号量,让后续阻塞程序向下执行
System.out.println("zk 建立连接");
connectedSemaphore.countDown();
}
}
}
});
if (States.CONNECTING == zk.getState()) {
connectedSemaphore.await();
}
// 如果存在父节点则不创建父节点
if (null == zk.exists(zk_father, false)) {
// 创建父节点
zk.create(zk_father, zk_father.getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
}
} catch (Exception e) {
// TODO Auto-generated catch block
// e.printStackTrace();
throw new RuntimeException(e);
}
// 进行阻塞
// System.out.println(".."); } @Override
public SampleResult runTest(JavaSamplerContext arg0) {
String zk_children = arg0.getParameter("zk_children"); //获取zk_children
String zk_context = arg0.getParameter("zk_context"); //获取zk_context
// System.out.println(zk_context+" "+zk_children);
/*
* SampleResult这个类是用来将测试结果输出到查看结果树中的。
* 并且也是用来控制事务的开始和结束的。
*/ SampleResult results = new SampleResult();
results.setSampleLabel("zk节点测试:"+zk_father); try{
// 事务开始标记
results.sampleStart();
// 创建子节点
zk.create(zk_father+zk_children, zk_context.getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// 获取节点洗信息
byte[] data = zk.getData(zk_father+zk_children, false, null);
// System.out.println(new String(data));
resultData = new String(data);
if(null == resultData){
results.setSuccessful(false);
results.setResponseData("zk result is null",null);
results.setDataType(SampleResult.TEXT);
}
results.setSuccessful(true);
}catch(Exception e){
results.setSuccessful(false);
results.setResponseData(e.toString(),null);
results.setDataType(SampleResult.TEXT);
e.printStackTrace();
return results;
}finally{
//标记事务结束
results.sampleEnd();
}
// System.out.println("写入成功");
// results.setSuccessful(true);
results.setResponseData(resultData,null);//将数据打印到查看结果树当中
results.setDataType(SampleResult.TEXT);
return results;
} /**
* 测试结束方法,结束测试中的每个线程
* 实际运行时,每个线程仅执行一次,在测试方法运行结束后执行,类似于Loadrunner中的End方法
*/ public void teardownTest(JavaSamplerContext arg0) {
try {
zk.close();
System.out.println("关闭");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

代码及依赖包如下:

性能测试Jmeter压测ZooKeeper-自定义java请求的更多相关文章

  1. jmeter压测过程中报java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider

    由于在java中添加了第三方安全策略文件,具体请看https://www.cnblogs.com/mrjade/p/10886378.html,导致在用jmeter压测过程中会遇到以下错误 解决办法: ...

  2. 【Java分享客栈】未来迈向高级工程师绕不过的技能:JMeter压测

    前言 因为工作需要,久违的从自己的有道云笔记中去寻找压测相关的内容,翻开之后发现还不错,温故一遍后顺便整理出来分享给大家. 题外话,工作8年多,有道云笔记不知不觉都6G多了,扫一眼下来尽是云烟过往,竟 ...

  3. JMeter压测“java.net.BindException: Address already in use: connect”解决方法

    之前在windows机上用JMeter压测,50并发下出现大量接口报“java.net.BindException: Address already in use: connect”错误. 从字面的意 ...

  4. windows下Jmeter压测端口占用问题(亲测有效)

    windows下Jmeter压测端口占用问题 1 报错信息描述 压测的初期,在设置了 150qps/s 的并发数下压测几分钟后 Jmeter 就出现了如下报错. JAVA.NET.BINDEXCEPT ...

  5. windows下Jmeter压测端口占用问题

    https://blog.csdn.net/weixin_43757847/article/details/88188091 1 前情提要人脸识别项目中,云平台新增了人脸识别的校验接口.考虑到存在大量 ...

  6. Jmeter性能测试之如何写Java请求测试用例类

    一. 引言: 最近工作中的一个项目要求做性能测试,该项目由提供服务的几个应用组成,选用的框架是阿里巴巴公司开源的服务框架Dubbo.关于Dubbo的介绍,网上也有很多资料,本人只是做了粗略的了解,没有 ...

  7. jmeter 压测duobbo接口,施压客户端自己把自己压死了

    jmeter 压测duobbo接口,jmeter代码不合理,导致每执行一次请求,会调用一次消耗内存的实例化.导致越压越慢,请求发不出去.这个时候需要考虑修改代码了. 截图中,tps越来越少. 原来初始 ...

  8. jmeter压测学习1-window环境准备与案例

    前言 最近用jmeter做一些接口的压力测试,记录下使用过程中遇到的一些问题. 在使用window机器做并发压测的时候,发现并发数设置100的时候,会出现报错:java.net.SocketExcep ...

  9. 一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本

    ​    ​接上篇,一键转化将接口测试平台测试用例转化成Jmeter压测脚本思路,这里我首先在java 上面做了一个简单的实验,看看 转化的中间遇到的问题,这里呢,我只是给了一个简单的demo 版本, ...

随机推荐

  1. Spring Boot 定时任务使用

    详情参考文章https://blog.csdn.net/qq_31001665/article/details/76408929

  2. [Java Web学习]junit.framework.AssertionFailedError: No tests found in {Class}

    No tests found in com.XXXXX.XXX.inboundPrepService.bizLogic.prepDeterminationEngine.workers.Determin ...

  3. mysql 中文支持

    show variables like 'character%';  SHOW VARIABLES LIKE 'collation_%'; recommend to use utf8mb4 inste ...

  4. 用理论告诉你 三极管和MOS管的区别在哪

    在电路设计当中假设我们想要对电流中止控制,那就少不了三极管的帮助.我们俗称的三极管其全称为半导体三极管,它的主要作用就是将微小的信号中止放大.MOS管与三极管有着许多相近的地方,这就使得一些新手不断无 ...

  5. BF匹配器

    对于BF匹配器,首先我们得用cv2.BFMatcher()创建BF匹配器对象.它取两个可选参数,第一个是normType.它指定要使用的距离量度.默认是cv2.NORM_L2.对于SIFT,SURF很 ...

  6. edgedb 内部pg 数据存储的探索 (二) 创建数据库命令说明

    前面已经创建好了一个简单可以访问pg 的edgedb 环境,现在测试几个数据库操作命令在pg 的存储 创建数据库 连接环境 注意账户是按照上次创建的环境配置 edgedb -u edgedb 创建数据 ...

  7. Python3 多线程例子

    import threading, zipfile class AsyncZip(threading.Thread): def __init__(self, infile, outfile): thr ...

  8. fiddler 按条件过滤

    使用fiddler抓包过程中最希望获取自己想要的数据,不重要的信息最希望的是过滤,如果重要和不重要的数据都展示对我们在寻找资源的时候产生了很大的干扰,所以我们需要按条件过滤: 1.启用fiddler ...

  9. Angular2+AngularJS

    AngularJS 系列: 1.angular.module 的定义 var mapApp = angular.module("positionSalaryEditApp",[&q ...

  10. 利用chrome浏览器爬取数据

    相关的库自己下载吧,直接上代码 from selenium import webdriver from bs4 import BeautifulSoup import time #手动添加路径 pat ...