背景:接上一篇JMeter二次开发之gRPC插件开发(二)
目录
1.JMeter取样器
package grpc.client.jmeter;
import com.java.grpc.stub.HelloReply;
import grpc.client.GrpcClient;
import io.grpc.StatusRuntimeException;
import org.apahce.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;
public class HelloGrpcSampler extends AbstractJavaSamplerClient{
GrpcClient grpcClient = null;
String host = "127.0.0.1";
String port = "50052";
String name = "zhangsan";
// 设置可用参数及默认值。这里设置的变量名和变量值会体现在Java Request元件的页面上
@Override
public Arguments getDefaultParameters(){
Arguments defaultParameters = new Arguments();
defaultParameters.addArgument("host", host);
defaultParameters.addArgument("port", port);
defaultParameters.addArgument("name", name);
return defaultParameters;
}
// 每个线程测试前执行一次,做一些初始化工作
@Override
public void setupTest(JavaSamplerContext context){
System.out.println("sample setup..");
this.host = context.getParameter("host"); // 从JMeter中获取变量的值
this.port = context.getParameter("port");
this.name = context.getParameter("name");
// 建立连接
this.grpcClient = new GrpcClient(host, Integer.parseInt(port));
super.setupTest(context);
}
@Override
public SampleResult runTest(JavaSamplerContext context){
SampleResult sampleResult = new SampleResult();
sampleResult.sampleStart(); // JMeter开始统计响应时间标记
try{
// 调用被测对象
HelloReply helloReply = this.grpcClient.sendReadRequestToService(grpcClient, name);
sampleResult.sampleEnd();
sampleResult.setSuccessful(true);
sampleResult.setResponseData(helloReply.toString().getBytes());
sampleResult.setResponseMessage("Success");
sampleResult.setResponseCodeOK(); // 取样器结果的响应状态码:200
}catch(StatusRuntimeException e){
sampleResult.sampleEnd(); // JMeter结束统计响应时间标记
sampleResult.setSuccessful(false);
sampleResult.setResponseMessage("Exception: " + e);
java.io.StringWriter stringWriter = new java.io.StringWriter();
e.printStackTrace(new java.io.PrintWriter(stringWriter));
sampleResult.setResponseData(stringWriter.toString().getBytes());
sampleResult.setDataType(SampleResult.TEXT);
sampleResult.setResponseCode("500");
}
return sampleResult;
}
// 测试结束时调用
@Override
public void teardownTest(JavaSamplerContext context){
try{
System.out.println("service shutdown...");
grpcClient.shutdown();
}catch(InterruptedException e){
e.printStackTrace();
}
super.teardownTest(context);
}
// 自我调试
// public static void main(String[] args){
// HelloGrpcSampler helloGrpcSampler = new HelloGrpcSampler();
// Arguments arguments = helloGrpcSampler.getDefaultParameters();
// JavaSamplerContext context = new JavaSamplerContext(arguments);
// helloGrpcSampler.setupTest(context);
// helloGrpcSampler.runTest(context);
// helloGrpcSampler.teardownTest(context);
// }
}
2.打包
这里笔者直接用IDEA中的命令进行打包。选择工程右侧Maven-》Lifecycle-》package进行打包。
3.插件的使用
1)将打包好的jar包,放到JMeter安装目录的lib/ext下,重启JMeter;
2)创建线程组,添加Java Request,选择前面做好的类。(这里的图示为示意)
4.遇到的问题
1. 打好的jar包放到jmeter中,点击java request请求时报错,无法查看到界面,并且出现如下各种报错:
1)java.lang.NoSuchMethodError: io.grpc.netty.NettyChannelBuilder.usePlaintext
原因:pom.xml中缺少netty的包或者netty包的版本不对。这里删除了所有单独的netty包,引入了grpc-all包
2)java.lang.NoClassDefFoundError: org/apache/qpid/url/BindingURL
原因:a.尝试在pom.xml中引入qpid-client和qpid-common两个包,仍报错后采用b方法
b.缺少qpid-client和qpid-common的jar包,这两个包是JMeterPlugins_ExtrasLibs/lib中的包,将jar包放到lib/ext中
3)java.lang.NoClassDefFoundError: org/springwork/jms...
原因:缺少spring-core和spring-jms的jar包,这两个包是JMeterPlugins_ExtrasLibs/lib中的包,将jar包放到lib/ext中
2. 在maven工程中去掉不必要的jar包:参考 https://www.jianshu.com/p/ed14399bd3d7
3. maven工程出现警告,没有配置好slf4j:slf4j包引入问题,需要引入slf4j-api.jar和slf4j-log4j12.jar包;若还缺少包或日志包不对,考虑引入log4j-core和log4j-api包
附录:参考资料
1. https://blog.csdn.net/jielysong117/article/details/75200119
2. https://www.iteye.com/blog/shift-alt-ctrl-2292862