Jmeter:如何初始化map一次并为线程组中的所有线程共享它

时间:2015-02-23 05:17:59

标签: jmeter

我的 j-meter测试计划中有一个线程组,我想预先初始化两个地图。像

java.util.HashMap myMap1 = new java.util.HashMap();
myMap1.put("foo1","bar1");
myMap1.put("foo2","bar2");

java.util.HashMap myMap2 = new java.util.HashMap();
myMap2.put("mykey",myMap1);

我必须将它用于不同的线程。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

根据您用于编写脚本的测试元素,可能有两个选项:

  1. 如果您使用Beanshell Sampler - 最简单的选项是使用bsh.shared命名空间

    在第一个线程组中:

    Map myMap1 = new HashMap();
    myMap1.put("foo","bar");
    bsh.shared.myMap = myMap1;
    

    在第二个线程组中:

    Map myMap1 = bsh.shared.myMap;
    log.info(myMap1.get("foo"));
    
  2. 更多“通用”方式是使用JMeter属性。在任何支持脚本的测试元素(JSR223采样器,BSF采样器等)中,JMeter属性的当前实例的简写形式为props,它基本上是java.util.Properties类的实例,因此它已放置()接受任意Java Object作为值的方法。所以

    在第一个线程组中:

    Map myMap1 = new HashMap();
    myMap1.put("foo","bar");
    props.put("myMap", myMap1);
    

    在第二个线程组中:

    Map myMap1 = props.get("myMap");
    log.info(myMap1.get("foo"));
    

答案 1 :(得分:0)

如果您需要在多个线程之间共享此类内容,请转到Singleton Object。由于单个对象将在所有线程之间共享,因此所有线程都将看到相同的更改。

有关更多说明,请参阅以下代码段: -

import java.util.HashMap;

public class SingletonMap {
    private  HashMap myMap1 = null;
    private  HashMap myMap2 = null;
    private static volatile SingletonMap singletonMapObj = null;

    private SingletonMap(){
        myMap1 = new HashMap();
        myMap2 = new HashMap();

        myMap1.put("foo1","bar1");
        myMap1.put("foo2","bar2");

        myMap2.put("mykey",myMap1);
    }

    public static SingletonMap getSingletonMap(){
        if(singletonMapObj == null){
            new SingletonMap();
        }

        return singletonMapObj;
    }
}