从JSR223转Java Request Sampler:如何获取与设置JMeter属性?
从JSR223 Sampler迁移到Java Request Sampler:存储自定义Driver实例并复用
我之前也踩过从JSR223切换到Java Request Sampler的坑,核心区别是Java Request需要编写自定义Java采样器类(而非直接写脚本),下面针对你的需求一步步拆解实现:
1. 编写自定义Java采样器类
创建一个继承org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient的类,重写runTest方法来处理Driver实例的存储与方法调用:
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.threads.JMeterContextService; // 导入你的自定义Driver类,替换成实际包路径 import com.yourcompany.utils.Driver; public class DriverBasedSampler extends AbstractJavaSamplerClient { @Override public SampleResult runTest(JavaSamplerContext context) { SampleResult result = new SampleResult(); result.sampleStart(); // 启动采样计时 try { // 1. 获取或初始化Driver实例(全局复用用JMeter上下文存储) Driver driver; if (JMeterContextService.getContext().get("p_driver") == null) { driver = new Driver(); // 把Driver实例存入JMeter全局上下文,等价于JSR223里的props JMeterContextService.getContext().put("p_driver", driver); } else { // 从上下文取出已存在的Driver实例,注意强制类型转换 driver = (Driver) JMeterContextService.getContext().get("p_driver"); } // 2. 调用getJsonObject方法,参数可从Java Request配置中读取 String dbser = context.getParameter("db_server"); String dbn = context.getParameter("db_name"); String wfid = context.getParameter("workflow_id"); Object object = driver.getJsonObject(dbser, dbn, wfid); // 3. 把结果存入JMeter变量,供后续采样器使用 JMeterContextService.getContext().getVariables().putObject("retrieved_object", object); result.setSuccessful(true); result.setResponseData("Object retrieved successfully: " + object.toString(), "UTF-8"); } catch (Exception e) { result.setSuccessful(false); result.setResponseMessage("Error occurred: " + e.getMessage()); e.printStackTrace(); } finally { result.sampleEnd(); // 结束采样计时 } return result; } }
2. 配置Java Request Sampler
- 将编译好的
DriverBasedSampler.class和你的自定义Driver.class一起放到JMeter的lib/ext目录,重启JMeter让类加载生效。 - 在测试计划中添加Java Request Sampler,在「Classname」下拉框里选择你的
DriverBasedSampler类。 - 如果需要动态传入
db_server、db_name等参数,在Java Request的「Parameters」面板添加键值对,代码里就能通过context.getParameter()读取到。
3. 关键注意事项
- 实例复用:用
JMeterContextService.getContext()存储Driver实例,能在同线程组的所有采样器间共享,避免重复初始化。 - 类型安全:从上下文取出Driver时必须强制转换为你的自定义
Driver类型,否则会触发ClassCastException。 - ClassPath问题:自定义类一定要放在
lib/ext目录,否则Java Request会找不到类文件。
临时方案:直接在Java Request中写代码
如果不想编写完整的采样器类,也可以直接在Java Request的「Code」面板中编写逻辑(灵活性稍差,但快速验证可用):
import org.apache.jmeter.threads.JMeterContextService; import com.yourcompany.utils.Driver; SampleResult result = new SampleResult(); result.sampleStart(); try { Driver driver = (Driver) JMeterContextService.getContext().get("p_driver"); if (driver == null) { driver = new Driver(); JMeterContextService.getContext().put("p_driver", driver); } Object object = driver.getJsonObject("test_db", "order_db", "WF001"); result.setSuccessful(true); } catch (Exception e) { result.setSuccessful(false); result.setResponseMessage(e.getMessage()); } result.sampleEnd(); return result;
更推荐第一种自定义类的方式,代码更易维护,也方便后续扩展参数化和逻辑复用。
内容的提问来源于stack exchange,提问作者Faiz
相关产品推荐
相关产品推荐

