jmeter 线程本地缓存连接

ljsrvy3e  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(170)

我使用JMeter属性来存储threadLocalCachedConnection对象,并确保使用唯一的属性名作为属性。
在线程组1中,我有一个JSR223后处理器来抓取每个线程的会话(VU),然后将其存储在一个名为sessionID的属性中。

我添加了另一个JSR223后处理器,作为线程组1中最后一个采样器的子级。

def connection = sampler.threadLocalCachedConnection
props.put("presenterConnection" + ctx.getThreadNum(), connection.get())

在线程组2中,我添加了一个JSR223预处理器作为第一个采样器的子级。

def presenterConnection = props.get('presenterConnection' + ctx.getThreadNum())
sampler.threadLocalCachedConnection.set(presenterConnection)

String sendCommand = "SEND\n" +
         "content-type:application/json;charset=UTF-8\n" +
         "destination:/v1/session/${__property(sessionId)}/command\n" +
         "id:perftest01-presenter-${__property(sessionId)}\n" +
           "\n" + 
           "{\"type\": \"go-to-slide\", \"data\": {\"index\": 0}}\n" +
           '\0'  // note: NULL char at end
           ;
vars.put("wsStompSendCommand", sendCommand);

我用2个线程(VU)进行了测试。为什么两个线程都使用最后一个sessionId,而不是每个线程使用一个sessionId?

4xrmg8kj

4xrmg8kj1#

根据JMeter Documentation
属性与变量不同。变量是线程的局部变量;属性对所有线程通用
所以你的台词

props.put('sessionId', vars.get('sessionUUID'))

创建一个全局sessionId属性,该属性为:

  • 对所有线程通用,无论它们在哪个线程组中
  • 在您关闭JMeter/JVM之前一直存在

您需要使用与presenterConnection相同的技巧,即:

props.put('sessionId_'+ ctx.getThreadNum(), vars.get('sessionUUID'))

然后在需要时阅读:

def sessionId =  props.get('sessionId_'+ ctx.getThreadNum())

更多信息:Apache Groovy: What Is Groovy Used For?

相关问题