要想通过自定义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,序列化标记接口,这样可以让我们的类去实现序列化。