Jmeter:如何初始化映射一次并将其共享给线程组中的所有线程

Jmeter : How to initialize map once and share it for all threads in a thread group

我的 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);

而且我必须将它用于不同的 threads.Can 谁能帮我解决这个问题?

如果您需要在多个线程之间共享此类内容,请使用 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;
    }
}

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

  1. 如果您使用 Beanshell Sampler - the easiest option is using 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. 更多"generic" 方法是使用 JMeter Properties。 JMeter Properties 的当前实例的 shorthand 在任何启用脚本的测试元素(JSR223 Sampler、BSF Sampler 等)中作为 props 可用,它基本上是 java.util.Properties class 因此它有 put() 方法接受任意 Java 对象作为值。所以

    在第一个线程组中:

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

    在第二个线程组中:

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