首页 > 解决方案 > 处理 JMeter WebSocket Sampler 的响应

问题描述

我是编程新手,有必要编写程序来使用 JMeter 进行负载测试,因为我找不到现有的 GUI 工具来执行我想做的事情。

我正在尝试使用 JMeter 插件“<a href="https://github.com/maciejzaleski/JMeter-WebSocketSampler/blob/master/README.md" rel="nofollow noreferrer">JMeter WebSocket 加载测试 WebSocket 应用程序采样器”。

我需要建议我应该如何处理从 WebSocket 服务器发送的消息。

这里有一些条件。

  1. 与 WebSocket 服务器建立连接后,服务器会在任意时间发送 JMeter 消息。
  2. 当 JMeter 收到消息时,它必须返回消息以通知消息已收到。
  3. 根据来自服务器的消息内容,JMeter 必须修改局部变量。

这是我当前的 JMeter 配置概述。

  1. 使用并行控制器来划分线程接收消息和发送消息。

  2. 在接收消息线程中,我尝试使用空WebSocket采样器下的JSR223 Listner编写JavaScript来处理接收到的数据。服务器以 JSON 格式发送数据。

  3. 在发送消息线程时,我使用 While Loop 控制器,它会等到变量值被更改,在接收消息线程时,基于服务器的消息。

例如,当服务器向 JMeter 发送消息“Event_A_Notify”时,接收消息线程检查并将 Event 变量设置为“A”。然后,发送消息线程将向服务器发送“Event_A_Received”。

我遇到的问题是如何处理收到的消息。

在 JSR223 Lisner 中,我可以使用sampleResult.getResponseDataAsString()方法以字符串格式从 WebSocket 服务器检索消息。

这是数据的样子。(我修改了内容使其看起来简单。实际消息内容更大,属性更多)。

[Message 1]
{"Sample1":"A","uuid":"a5c77959-0284-40eb-9523-8706c947b620"}

[Message 2]
{"Sample2":"B","uuid":"93330fff-13fe-4040-9fe7-0e6d7054ee4a"}    

[Message 3]
{"Sample3":"C","uuid":"099cea81-6f8f-4417-b0c5-29199f42a6f3"}    

[Message 4]
{"Sample4":"D","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a1"}    

当接收到的消息超过 10 条时,JMeter 会删除较旧的消息以保留 10 条最近的消息。

[Message 8]
{"Sample8":"H","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a1"} 

[Message 9]
{"Sample9":"I","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a2"} 

[Message 10]
{"Sample10":"J","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a3"} 

[Message 11]
{"Sample11":"K","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a4"} 

[Message 12]
{"Sample12":"L","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a5"} 

[Message 13]
{"Sample13":"M","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a6"} 

[Message 14]
{"Sample14":"N","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a7"} 

[Message 15]
{"Sample15":"O","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a8"} 

[Message 16]
{"Sample16":"P","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a9"} 

[Message 17]
{"Sample17":"Q","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a50810"} 

这里是 JSR223 Listner 处理接收到的消息的内容。

基本上,我会做以下事情。

  1. 使用sampleResult.getResponseDataAsString(); 检索响应。
  2. 使用String(responseData).split(/[Message [0-9]+]/); 并通过删除 [Message \d] 将字符串拆分为消息数组。
  3. 使用数组对象 messageArray 存储来自 WebSocket 服务器的所有响应。并在for循环中一一处理。
var responseData = sampleResult.getResponseDataAsString();

var counter = parseInt(vars.get("counter1"));

var messageList = new String(responseData).split(/\[Message [0-9]+\]/);

messageList.shift();

var messageArray = vars.getObject("messageArray");

messageList.forEach(function(message, index) {
    if (messageArray.indexOf(message) >= 0) {
     return true;
  }
  else {
     messageArray.push(message);
  }
});

for (i = counter; i < messageArray.length; i++) {

    if (messageArray[i].match(/(someEvent).*/)) {
         vars.put("userVariable",true);
       counter += 1;
       break;
   }
   else {
          vars.put("userVariable",false);
      counter += 1;
   }
}

vars.put("counter1",counter);
vars.putObject("messageArray", messageArray);

这段代码的问题是:

  1. 由于 messageArray 对象存储了所有消息,因此 messageArray 变得太大,JMeter 最终会因 OutOfMemory 异常而崩溃。
  2. 检查接收到的消息是否存在于 messageArray 中的代码太慢,并且随着存储的消息数量的增加,性能呈指数下降。

有人可以推荐更有效和更智能的方式来处理 JMeter 中的 WebSocket 消息吗?

我非常感谢您的意见。

谢谢,

此致,

标签: javascriptarraysjsonwebsocketjmeter

解决方案


与 WebSocket 服务器建立连接后,服务器会在任意时间发送 JMeter 消息。当 JMeter 收到消息时,它必须返回消息以通知消息已收到。根据来自服务器的消息内容,JMeter 必须修改局部变量。

使用这个插件很容易实现:https ://bitbucket.org/pjtr/jmeter-websocket-samplers/src/master/ 。它提供了一个“读取采样器”,您可以使用它来等待消息,而不是从收到的消息中提取您需要的任何内容并使用“写入采样器”将消息返回给服务器。


推荐阅读