使用JMeter对Spring Integration TCP服务器负载测试:服务器收不到消息
排查JMeter TcpSampler无法向Spring Integration TCP服务器发送文本的问题
我之前也踩过Spring Integration TCP和JMeter TcpSampler通信的坑,结合你的情况,给你几个具体的排查方向:
1. 重点检查消息分隔符(最常见原因)
Spring Integration TCP默认依赖消息分隔符来识别完整消息,比如常用的ByteArrayCrLfSerializer会以\r\n作为结束标记。但JMeter的TcpSampler默认发送的文本是不带结束符的,导致服务器一直等待完整消息,看起来就像没收到。
解决方法:
- 在TcpSampler的「Text to send」末尾手动加上
\r\n - 或者用JMeter函数生成标准换行符:
${__char(13)}${__char(10)}
2. 核对TcpSampler的核心配置
- TCPClient类选择:如果是文本通信,优先用
org.apache.jmeter.protocol.tcp.sampler.TextTCPClientImpl,而不是默认的Binary实现;同时确保编码和服务器一致(比如UTF-8) - 连接复用设置:如果勾选了「Reuse connection」,要确认每次发送的消息都带正确的分隔符,避免粘包导致服务器解析失败
- 超时设置:适当调大「Response Timeout」,避免服务器还没处理完就被JMeter判定为超时
3. 开启DEBUG日志排查细节
你的现有日志只显示到线程组启动,看不到发送消息的具体情况:
- JMeter端:修改
jmeter.properties,设置log_level.jmeter.protocol.tcp=DEBUG,重启后能看到发送的字节流、连接状态等细节 - Spring Integration端:开启DEBUG日志,查看服务器是否接收到字节,以及是否因为格式不匹配被序列化器丢弃
4. 用工具验证通信链路
先用telnet或netcat手动发送测试消息,比如:
telnet your-server-ip port > hello world\r\n
如果服务器能正常接收,说明问题出在JMeter配置;如果telnet也收不到,那要检查Spring Integration的TCP端点配置,比如:
- 是否正确配置了
deserializer(比如ByteArrayCrLfDeserializer) - 有没有添加消息过滤器导致消息被拦截
你的原始日志:
INFO o.a.j.e.StandardJMeterEngine: Running the test!
INFO o.a.j.s.SampleEvent: List of sample_variables: []
INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, local)
INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : Thread Group
INFO o.a.j.e.Sta...
内容的提问来源于stack exchange,提问作者merla
相关产品推荐
相关产品推荐

