我们有一个 applet-servlet 通信,我们希望使用 JMeter 的 HTTP 代理来记录它。它使用 GET 消息,直到小程序发送包含一些序列化 Java 对象(内置类型)的 HTTP POST 消息,然后我们在小程序中收到此错误:

替代文本 http://img339.imageshack.us/img339/9238/appletservletjmeterhttp.png

好的,队列中的某个地方存在一些 JVM 版本冲突。但是哪里?

无需JMeter,通信运行正常,即:Applet -> Tomcat -> Servlet。全部在我的本地机器上。

但它不能通过 JMeter 工作:Applet -> JMeter 代理 -> Tomcat -> Servlet。也都在我的机器上。

就好像 JMeter 正在修改 POST 消息内容......

我也使用 Apache 代理进行了测试,工作正常。

更有趣的是,我只安装了一个版本的 Java,一个 JDK 和一个 JRE。两者都是 1.6.0_07...

我想在开始深入挖掘兔子洞之前先问一下;-)

以下是直接发送到 Tomcat 的 POST 数据的十六进制转储:

00000348  ac ed 00 05 73 72 00 11  6a 61 76 61 2e 6c 61 6e ....sr.. java.lan
00000358  67 2e 49 6e 74 65 67 65  72 12 e2 a0 a4 f7 81 87 g.Intege r.......
00000368  38 02 00 01 49 00 05 76  61 6c 75 65 78 72 00 10 8...I..v aluexr..
00000378  6a 61 76 61 2e 6c 61 6e  67 2e 4e 75 6d 62 65 72 java.lan g.Number
00000388  86 ac 95 1d 0b 94 e0 8b  02 00 00 78 70 00 00 01 ........ ...xp...
00000398  7b                                               {

这是通过 JMeter 发送的数据:

00000128  ac ed 00 05 73 72 00 11  6a 61 76 61 2e 6c 61 6e ....sr.. java.lan
00000138  67 2e 49 6e 74 65 67 65  72 12 e2 a0 a4 f7 3f 3f g.Intege r.....??
00000148  38 02 00 01 49 00 05 76  61 6c 75 65 78 72 00 10 8...I..v aluexr..
00000158  6a 61 76 61 2e 6c 61 6e  67 2e 4e 75 6d 62 65 72 java.lan g.Number
00000168  3f ac 3f 1d 0b 3f e0 3f  02 00 00 78 70 00 00 01 ?.?..?.? ...xp...
00000178  7b                                               {

第二个转储中有很多“3f”......所以这肯定是某种编码问题。标题中的内容类型设置正确:

POST /ABCOrder/ABCServlet?cmd=getNetworkConnection HTTP/1.1
Connection: keep-alive
Content-Type: application/octet-stream
Host: 109.107.148.164:8443
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
User-Agent: Mozilla/4.0 (Windows Vista 6.0) Java/1.6.0_14
Content-Length: 81
有帮助吗?

解决方案

下面是解决方案: JMeter的具有一个配置文件,的仓/ jmeter.properties 即可。 在这里你可以找到一个选项,在这里你可以设置二进制内容类型:

# Binary content-type handling
# These content-types will be handled by saving the request in a file:
proxy.binary.types=application/x-amf,application/x-java-serialized-object

现在我不知道为什么应用程序/八位字节流默认情况下不包括在内,但你可以简单地把它添加到列表中,就大功告成了。

proxy.binary.types=application/x-amf,application/x-java-serialized-object,application/octet-stream

这是我怎样发现出来: https://issues.apache.org/bugzilla/show_bug.cgi?id= 44808

难道上的JMeter搜索的关闭的错误...: - )

其他提示

别人报告的是非常相似的: http://markmail.org/message/pl5erin2isehm5q6 。我找不到他们的 bug跟踪系统尽管与这一问题有关的任何问题。它看起来像你赢得了特权在兔子洞越挖越深:)

接受的答案仅允许记录静态请求。这是不现实的,因为它不允许请求的任何变化(例如更改搜索的单词,...),因此您将始终对同一组数据进行压力测试。

为了使其成为真正的测试,您需要使用第三方插件。

商业 JMeter 插件允许这样做,请参阅:

为了使测试更加真实,您需要改变序列化对象中的内容。

该 Java 序列化插件将允许执行以下操作:

  • 使用 JMeter 代理服务器轻松记录流量,将创建使用自定义采样器的测试计划

  • 通过简单的语法轻松更改请求(将显示为 XML),例如 ${searchedWord},其中 searchedWord 可以来自 CSV 或任何用户定义的变量。

  • 使用 JMeter 标准后处理器轻松从响应中提取数据

  • 通过标准 JMeter 查看结果树元素轻松调试请求/响应

免责声明:我在这家公司工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top