如何在Java Request Sampler中正确获取当前线程编号
错误原因
你获取线程编号的代码位置错误。
setupTest是采样器的初始化方法,由JMeter主线程在测试正式启动前统一执行,不属于虚拟用户工作线程的执行逻辑,此时上下文中的线程号默认值为0,无论线程组配置多少线程,这里拿到的结果永远是0。- 你的推测是正确的:线程组中配置的每个虚拟用户对应一个独立的执行线程,但每个工作线程执行采样逻辑时只会调用
runTest方法,不会重复执行setupTest。
修正方法
将获取线程编号的逻辑移动到runTest方法内部,即可拿到每个执行线程对应的正确编号,参考代码:
@Override public SampleResult runTest(JavaSamplerContext context) { SampleResult sampleResult = new SampleResult(); // 在采样执行逻辑中获取当前线程上下文的线程编号 int cThreadNum = JMeterContextService.getContext().getThreadNum(); sampleResult.sampleStart(); // 写入你的测试业务逻辑 sampleResult.sampleEnd(); sampleResult.setSuccessful(true); return sampleResult; }
补充说明
getThreadNum()返回的是当前线程在所属线程组内的编号,从0开始计数,和JMeter UI上展示的线程编号一致。setupTest仅适合存放全局仅需初始化一次的逻辑,比如公共配置加载、全局资源初始化,不要在此类方法中编写依赖线程上下文的代码。- 如果需要获取全局唯一的线程标识,不要依赖
getThreadNum(),可以通过JMeterContextService.getContext().getThread()获取线程对象后生成唯一标识。
内容的提问来源于stack exchange,提问作者Mats Johansson
相关产品推荐
相关产品推荐

