javascript - 处理 JMeter WebSocket Sampler 的响应

标签 javascript arrays json websocket jmeter

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

我正在尝试使用 JMeter 插件“JMeter WebSocket Sampler”来加载测试 WebSocket 应用程序”。

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

这里有一些条件。

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

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

  1. 使用Parallel Controller划分接收消息和发送消息的线程。

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

  3. 在发送消息线程中,我使用 While Loop Controller ,该 Controller 将根据服务器的消息,在接收消息线程中等待变量值发生更改。

例如,当服务器向 JMeter 发送消息“Event_A_Notify”时,接收消息线程检查并将事件变量设置为“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 消息吗?

非常感谢您的意见。

谢谢

最诚挚的问候,

最佳答案

After establish the connection with a WebSocket server, server sends JMeter messages in an arbitrary timing. When JMeter receives a message, it has to return message to notify the message is received. Based on a message contents from the server, JMeter has to modify local variables.

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

关于javascript - 处理 JMeter WebSocket Sampler 的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52270745/

相关文章:

javascript - 单击事件在响应式菜单中不起作用

sql - 使用 Liquibase 创建 Postgres Varchar 数组列

json - 如何从 json 文件中检索字段

javascript - 无法使用 JavaScript 更改 div 的类

javascript - 为什么ajax请求时字符 "+"没有发送到php文件?

mysql - VB.Net 不使用数据库数据填充数组

javascript - Node js可以在for循环期间通过外部函数修改数组吗?

php - json 列与多列

java - 我无法使用 Play 框架 2.1 提供 JSON 响应

javascript - 当我执行 npm 安装时, Node js 添加不需要的模块