JavaSamplerClient
JMeter提供了一种依靠纯编码方式构建Sampler的组件——JavaSamplerClient,这是一种为具备Java代码基础编程能力的技术人员准备的礼物,因为,你几乎可以像写LoadRunner脚本似的来开发你的JMeter脚本。
简单回顾一下JavaSamplerClient:
JMeter还默认为我们提供了两个例子,使用起来非常简洁只需要在类名称中选择需要执行的JavaSamplerClient,在配置一些必要的参数即可。
开发一个TCPJavaSamplerClient
服务器Mock环境
首先,构建一个简单的TCPServer环境,通过线程池accept客户端的Socket连接请求,并不断接收来自客户端发来的消息,并打印到控制台,参考代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TCPServer {
private int port = 10009;
private ServerSocket serverSocket;
private ExecutorService executorService;
private final int POOL_SIZE = 20;
public TCPServer() throws IOException{
serverSocket = new ServerSocket(port);
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);
}
public void service(){
while(true){
Socket socket = null;
try {
socket = serverSocket.accept();
executorService.execute(new Handler(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new TCPServer().service();
}
}
class Handler implements Runnable {
private Socket socket = null;
private BufferedReader br = null;
public Handler(Socket socket){
this.socket = socket;
}
private BufferedReader getReader(Socket socket) throws IOException{
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void run(){
try {
System.out.println("New connection accepted " + socket.getInetAddress()+ ":" + socket.getPort());
BufferedReader br = getReader(socket);
String msg = null;
while((msg=br.readLine()) != null){
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(br != null){
br.close();
}
if(socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
TCPJavaSamplerClient
通过TCPSocket的长连接方式,不断向服务器发送消息来进行性能测试。TCPJavaSamplerClient需要继承AbstractJavaSamplerClient抽象类,通过setupTest、runTest、teardownTest方法完成整个测试声明周期,其中setupTest与teardownTest在整个线程执行中只执行一次用于初始化和结束(与LoadRunner脚本中的init和end概念一致),参考代码如下:
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class TCPJavaSamplerClient<