You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:57:33