【发布时间】:2015-11-17 09:18:40
【问题描述】:
我正在通过 protobuf 协议并使用 HTTP Request Sampler 测试一个项目。目标应用服务器也是用 Java 编写的。 响应中有错误的问题:
“无法读取 Protobuf 消息:协议消息包含 无效标签(零)。;嵌套异常是 com.google.protobuf.InvalidProtocolBufferException:协议消息 包含无效标签(零)”
情况是它不是在 100% 的请求中发生。当我使用 HttpClient4 时,大约有 30-40% 的失败请求。在我将其更改为 HttpClient3.1 后,错误率下降到 ~10%,这也不是什么好事。
要发送 protobuf 消息,我在 HttpSampler 的 Bodydata 选项卡中使用变量 ${data}。在 BeanShell 预处理器中,我执行以下操作:
(import and non-necessary stuff were ommited)
MapViewport mv = MapRequest.MapViewport.newBuilder().setMaxX(mc.getX()+15).setMaxY(mc.getY()+15).setMinX(mc.getX()-15).setMinY(mc.getY()-15).build();
byte[] data = mv.toByteArray();
vars.put("data", new String(data));
我还尝试使用不同的编码,例如 new String(data,"UTF-8") 等等。
如果在查看结果树的情况下查看请求选项卡,我可以说所有失败的消息都包含“?”符号:
似乎不应该发送一些奇怪的符号,但是在将字节数组保存到 String 后,大约 10% 的请求包含它们。
【问题讨论】:
-
因此,您将二进制流转换为字符串以另存为 var - 根据编码,这可能会充满问题。它也依赖于系统,行为可以改变。此外,当您是
${data}时,您正在发送一个字符串,该字符串对于某些二进制数据正在插入?想到的第一个解决方法是将二进制流写入文件并将文件路径用作bodydata 中的变量.但这会导致大量文件 I/O 用于大容量。嗯..这有点思想家。 -
另外,您可以组装自己的 HTTP 请求并从 beanshell 采样器发送它,而不是使用 HTTP 采样器。想知道 jmeter-plugins 中的
HTTP Raw Request是否有用。
标签: java jmeter protocol-buffers