dubbo的jmeter压测时jar包的热加载/动态加载
在做dubbo的jmeter压测时,需要把jar包放入jmeter的lib/ext目录下,但是jmeter启动的时候会自动加载这个目录lib目录及lib/ext目录,这样启动后放入这些目录下的jar包就不会加载了。
jmeter的master--slave/client模式下,作为jmeter client,jmeter-server服务一直是启动的,当新的jar包放入client后,无法读取,因此需要client的jmeter动态加载这些新放入的jar包。
解决办法参考:http://blog.csdn.net/kekadm/article/details/51783240
继上篇文章《Jmeter+H2Database动态部署JAR包到代理端》实现了测试业务jar包的动态部署后,再不重启代理端Jmeter的情况下,jar的变化内容仍无法自动加载到Jmeter内存,所以还是不能实现一次启动,动态更新的目的。
因为,Jmeter在启动的时候会自动加载lib目录下的jar包,如果不重启,目录下更新的jar包也不能加载到内存。所以,要实现类的动态加载,必须在Jmeter测试类中实现业务类的重载。
即在Jmeter测试类中的setupTest()方法中要自定义代码实现业务类的加载。
此处以一个简单例子说明实现过程:
编写要被测业务类:TransDemo.java
package perftest.jmeter.trans;
public class TransDemo {
public String action(){
Stringstr = "action1st.";
System.out.println(str);
return str;
}
public voidinit() {
System.out.println("testingstart....");
}
public voidend() {
System.out.println("testingover!!!!");
}
}
将其导出为perftest-trans.jar,将这个包放到jmeter/lib目录以外的地方。如:c:/perftest-trans.jar (不能放在Jmeter/lib目录下)。
编写Jmeter测试类:TransDemoActions.java
package perftest.jemter.action;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
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;
public classTransDemoActions extends AbstractJavaSamplerClient{
SampleResultresult= null;
public Class<?>trans = null;
Arguments params= null;
Method methodInit= null;
Method methodAction= null;
Method methodEnd= null;
MyClassLoader classLoader= null;
Object newTrans= null;
/**
* 自定义类加载方法
* @param jarpath
* @param classpath
*/
public void loadClass(String[] jarpath,Stringclasspath){
URL[] urls= new URL[] {};
classLoader = new MyClassLoader(urls,null);
try {
for(String jar:jarpath){
classLoader.addJar(new File(jar.trim()).toURI().toURL());
System.out.println("load jar file : "+jar.trim());
}
trans = classLoader.loadClass(classpath);
System.out.println("load class file : "+classpath);
methodInit = trans.getDeclaredMethod("init");
methodAction = trans.getDeclaredMethod("action");
methodEnd = trans.getDeclaredMethod("end");
boolean accessible = methodInit.isAccessible();
if(accessible ==false){
methodInit.setAccessible(true);
}
newTrans = trans.newInstance();
} catch (Exceptione) {
e.printStackTrace();
}
}
/**
* 自定义jmeter外部参数
*/
public Arguments getDefaultParameters() {
Arguments params= new Arguments();
params.addArgument("TRANS_JARPATH","c:/perftest-trans.jar");
params.addArgument("TRANS_CLASSPATH","perftest.jmeter.trans.TransDemo");
returnparams;
}
public void setupTest(JavaSamplerContext arg0) {
try {
loadClass(arg0.getParameter("TRANS_JARPATH").split(","),arg0.getParameter("TRANS_CLASSPATH"));
//通过反射调用TestDemo的init()方法,下同
methodInit.invoke(newTrans);
}catch(IllegalAccessException e) {
e.printStackTrace();
}catch(IllegalArgumentException e) {
e.printStackTrace();
}catch(InvocationTargetException e) {
e.printStackTrace();
}
}
@Override
public SampleResult runTest(JavaSamplerContextarg0) {
try {
methodAction.invoke(newTrans);
}catch(IllegalAccessException e) {
e.printStackTrace();
}catch(IllegalArgumentException e) {
e.printStackTrace();
}catch(InvocationTargetException e) {
e.printStackTrace();
}
returnresult;
}
public void teardownTest(JavaSamplerContext arg0) {
try {
methodEnd.invoke(newTrans);
}catch(IllegalAccessException e) {
e.printStackTrace();
}catch(IllegalArgumentException e) {
e.printStackTrace();
}catch(InvocationTargetException e) {
e.printStackTrace();
}catch (Exceptione) {
e.printStackTrace();
}
}
/**
* 自定义内部类实现动态加载class
* @author
*
*/
static class MyClassLoader extends URLClassLoader {
public MyClassLoader(URL[]urls) {
super(urls);
}
public MyClassLoader(URL[]urls, ClassLoader parent) {
super(urls,parent);
}
public void addJar(URL url) {
this.addURL(url);
}
}
}
将其导出为perftest-actons.jar,并将它放入<jmeterPath>/lib/ext下,在Jmeter启动时可以自动发现这个测试类: perftest.jemter.action.TestDemoActons 。
启动Jmeter,建立测试计划和添加线程组及“Java请求”
线程组大小设置为1,线程循环次数设置2:即一个虚拟用户进行2次迭代。
运行测试
运行测试可以看到System.out.println的输出结果:
修改被测业务类TransDemo的action()方法
public String action(){
//此处修改打印输出字符
String str = "actionsecond.";
System.out.println(str);
return str;
}
重新将TransDemo.class打包为perftest-trans.jar,并覆盖前面的c:/perftest-trans.jar
重新运行测试
在不关闭和重启Jmeter的情况下,再次执行测试,可以看到输出信息已经改变为“action seconde.”:
小结:
所以要实现类的动态加载,必须在Jmeter测试类AbstractJavaSamplerClient(java请求)中使用URLClassLoader实现被测业务类的重新加载,并使用invoke()方法调用业务方法。
自此,通过《Jmeter+H2Database动态部署JAR包到代理端》及本篇可以为分布式测试中的众多代理端实现被测业务(jar)包的实时更新及业务测试类(class)的热加载。
再也不用重启100+台Jmeter代理端而烦恼了。
dubbo的jmeter压测时jar包的热加载/动态加载的更多相关文章
- Dubbo-使用Maven构建Dubbo服务的可执行jar包
一.为什么要构建Dubbo服务的可执行jar包? 1.1 Dubbo服务运行方式比较 ✎使用Servlet容器运行(Tomcat.Jetty等) ---不可取 --缺点:增加复杂性(多了容器的端口) ...
- 使用jmeter实现对jar包的调用
一.前言 在我们测试接口的过程中,可能有时需要用到第三方jar包来生成一些测试数据(如有时需要对参数的输入值使用第三方jar包进行加密操作),涉及到这种的情况,普遍做法是:手动调用jar包获得需要的值 ...
- Jmeter引用外部jar包的几种方法
总结记录下jmeter引用外部jar包的3种方法及其优缺点: 一.测试计划中添加目录或jar包到Classpath 操作:测试计划->添加目录或jar包到Classpath-->浏览导入j ...
- jmeter maven自动移动jar包windows 批处理命令
jmeter项目maven文件下面放这.bat 工具,可以把必要的jar包移动到jmeter响应的文件夹下面 rem 本文件放在jmeter 脚本maven项目根目录下面,和pom.xml在同一个文件 ...
- 跟我学习dubbo-使用Maven构建Dubbo服务的可执行jar包(4)
Dubbo服务的运行方式: 1.使用Servlet容器运行(Tomcat.Jetty等)----不可取 缺点:增加复杂性(端口.管理) 浪费资源(内存) 官方:服务容器是一个standalone的启动 ...
- 【JMeter】Jmeter引入第三方jar包
Jmeter做remoteService,里面用到一个实体:clickEntity,是在一个第三方jar包定义的:com.bj58.opt.ad_logparser-0.0.18-SNAPSHOT.j ...
- Jmeter调用自定义jar包
一. 场景 在测试过程中, 可能需要调用第三方jar包来生成测试数据或者使用java工具类来实现业务场景, 普遍的做法是手动调用jar包, 再把这些值赋给jmeter中的某个参数, 以满足业务测试需求 ...
- SpringBank 开发日志 使用maven构建dubbo服务的可执行jar包
写这篇日志的时候,我已经完成了这个目标,并且中间经历了一次面试.现在回过头看,已经觉得印象不那么深刻了,果然还是一边思考,一边记录这样最好.但我还是严格要求自己,从新做了梳理,对相关配置进行了整理和说 ...
- jmeter引入外部jar包的方法
jmeter最完美的jar包引入 第一步:需要新建一个文件夹用来存放需要引用的外部jar包,例如:建一个dependencies 文件夹 第二步:jmeter 的配置文件 jmeter.propert ...
随机推荐
- iTOP-4412开发板全新升级支持4G全网通模块
开发板支持4G,GPS,CAN,485,WIFI蓝牙,重力加速度计,陀螺仪等模块. 核心板参数 尺寸:6cm*7cm 高度:连同连接器在内0.26cm CPU:Exynos4412,四核Cortex- ...
- (转)淘淘商城系列——引用dubbo服务
http://blog.csdn.net/yerenyuan_pku/article/details/72758663 上文我们一起学习了如何发布一个dubbo服务,本文我就来教大家如何在web工程中 ...
- WPF学习- 新建项目后自定义Main()[Type 'App' already defines a member called 'Main' with the same parameter types]
问题点: 在App.xaml.cs中自己添加Main方法,编译会出现如下报错: 错误 CS0111 类型“App”已定义了一个名为“Main”的具有相同参数类型的成员 错误 Type 'App' a ...
- CAD嵌套打印(com接口版)
当用户需要打印两个CAD控件的图纸时,可以采用嵌套打印实现.实现嵌套打印功能,首先将两个CAD控件放入网页中,C#代码如下: private void BatchPrintDialog() { MxD ...
- ubuntu 18.04 安装.net core
要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系那就只好在琢磨了,然后就发现了在github有安装的方法因为是18.04 所以 wget -qO- https://packages.micro ...
- es6 day01
es6语法必须加‘use strict’ 'use strict' //预解释 变量提升 先看下边例子来感受下let的用法与特点 /* console.log(a);//undefined 只声明未定 ...
- 通过反编译小程序来学习前端:wxappUnpacker
小程序开发时,会有4种文件:.wxss .json .wxs .wxml. 正式上传到腾讯时,目录会被打包,使用时再发放给客户端. 这个文件包后缀是 .wxapkg.只要手机用过这个小程序,文件 ...
- 【牛客小白月赛6】 J 洋灰三角 - 快速幂&逆元&数学
题目地址:https://www.nowcoder.com/acm/contest/136/J 解法一: 推数学公式求前n项和: 当k=1时,即为等差数列,Sn = n+pn(n−1)/2 当k≠1时 ...
- windows 安装 python3
安装python------------------------------------------------------------ 1,打开连接https://www.python.org/do ...
- 86-Money Flow Index 资金流量指数指标.(2015.7.3)
Money Flow Index 资金流量指数指标 计算: 1.典型价格(TP)=当日最高价.最低价与收盘价的算术平均值 2.货币流量(MF)=典型价格(TP)×N日内成交金额 3.如果当日MF> ...