javascript - 处理 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 服务器发送的消息。
这里有一些条件。
- 与 WebSocket 服务器建立连接后,服务器会在任意时间发送 JMeter 消息。
- 当 JMeter 收到消息时,它必须返回消息以通知消息已收到。
- 根据来自服务器的消息内容,JMeter 必须修改局部变量。
这是我当前的 JMeter 配置概述。
使用并行控制器来划分线程接收消息和发送消息。
在接收消息线程中,我尝试使用空WebSocket采样器下的JSR223 Listner编写JavaScript来处理接收到的数据。服务器以 JSON 格式发送数据。
在发送消息线程时,我使用 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 处理接收到的消息的内容。
基本上,我会做以下事情。
- 使用sampleResult.getResponseDataAsString(); 检索响应。
- 使用String(responseData).split(/[Message [0-9]+]/); 并通过删除 [Message \d] 将字符串拆分为消息数组。
- 使用数组对象 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);
这段代码的问题是:
- 由于 messageArray 对象存储了所有消息,因此 messageArray 变得太大,JMeter 最终会因 OutOfMemory 异常而崩溃。
- 检查接收到的消息是否存在于 messageArray 中的代码太慢,并且随着存储的消息数量的增加,性能呈指数下降。
有人可以推荐更有效和更智能的方式来处理 JMeter 中的 WebSocket 消息吗?
我非常感谢您的意见。
谢谢,
此致,
解决方案
与 WebSocket 服务器建立连接后,服务器会在任意时间发送 JMeter 消息。当 JMeter 收到消息时,它必须返回消息以通知消息已收到。根据来自服务器的消息内容,JMeter 必须修改局部变量。
使用这个插件很容易实现:https ://bitbucket.org/pjtr/jmeter-websocket-samplers/src/master/ 。它提供了一个“读取采样器”,您可以使用它来等待消息,而不是从收到的消息中提取您需要的任何内容并使用“写入采样器”将消息返回给服务器。
推荐阅读
- cobalt - 如何将系统语言设置转移到钴
- c++ - 为什么我在声明类对象时无法初始化它?
- c# - 如何设置 bsonDocument 的 id?
- oracle - Oracle 11 主键生成
- javascript - 处理 vuex 中的嵌套/复杂对象
- php - 如何使用 Google QR Code API 通过 PHP 将 QR 图像保存到数据库?
- javascript - NodeJS:为什么在用户注册期间未定义电子邮件?
- matlab - trapz 函数仅适用于有限的 x 范围
- python - 逐列而不是逐行写入csv
- ansible - 在没有 sudo 权限的情况下启动 Ansible playbook 以与 Windows 主机通信失败