如何使用JMeter对IBM MQ的SWIFT消息开展性能测试
JMeter对接IBM MQ测试SWIFT MT报文(支持运行时动态报文修改)实现方案
一、前置环境准备
- 打开JMeter插件管理器,搜索
IBM MQ完成对应插件安装,安装完成后重启JMeter即可看到MQ相关的原生采样器组件 - 找到本地IBM MQ客户端安装目录下
java/lib路径内的所有jar包,全部复制到JMeter安装目录的lib/ext文件夹下,重启JMeter避免类加载报错,注意客户端jar包版本要和MQ服务端版本保持一致,跨大版本混用大概率出现连接异常 - 提前准备1份符合字段规范的MT541基准报文模板,存为无BOM头的txt文件,提前确认报文换行符和MQ服务端要求一致(多数场景为LF格式)
二、运行时动态报文修改实现
不需要开发自定义插件,用JMeter自带组件即可覆盖所有动态字段替换需求,避免压测时重复报文被服务端校验拦截:
- 在主线程组最前端添加JSR223预处理程序,选择Groovy作为脚本语言,生成每次请求独有的、符合SWIFT格式要求的动态字段值,示例代码如下:
import java.util.UUID import java.time.format.DateTimeFormatter import java.time.LocalDateTime // 生成20位无重复字符的交易参考号,符合MT报文字段长度、字符集要求 def refNum = UUID.randomUUID().toString().replace("-", "").substring(0,20).toUpperCase() vars.put("swift_ref", refNum) // 生成SWIFT标准格式时间戳(YYMMDDHHMMSS) def currentTime = LocalDateTime.now() def swiftFmtTime = currentTime.format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) vars.put("swift_timestamp", swiftFmtTime) // 随机生成交易数量、结算金额,覆盖数值类动态字段 def random = new Random() def tradeQty = random.nextInt(100000, 999999).toString() vars.put("trade_qty", tradeQty) def tradeAmount = String.format("%.2f", random.nextDouble(10000, 999999)) vars.put("trade_amount", tradeAmount) // 从预置测试账号池随机取结算账号 def accountPool = ["ACC00123456", "ACC00789012", "ACC03456789", "ACC09012345"] def settleAcc = accountPool.get(random.nextInt(accountPool.size())) vars.put("settle_account", settleAcc)
- 打开IBM MQ对应的JMS点对点采样器,把提前准备好的MT541基准报文粘贴到消息内容输入框,所有需要动态替换的字段位置直接用
${变量名}占位即可,报文占位示例片段如下:
{1:F01BANKDEFFAXXX0000000000}{2:I541BANKCNBJAXXXN}{4: :16R:GENL :20C::SEME//${swift_ref} :23G:NEWM :98A::PREP//${swift_timestamp} :16R:TRADDET :35B:ISIN CN0000012345 :36B::ESTT//UNIT/${trade_qty} :19A::SETT//${trade_amount} :16R:SETTL :97A::SAFE//${settle_account} :16S:SETTL -}
注意:占位符不能拆断SWIFT报文的固定分隔符、换行结构,替换后的字段值要提前校验长度、字符范围符合MT541字段定义,否则会被MQ侧的报文校验逻辑直接拒收。
三、MQ采样器核心配置要点
配置JMS点对点采样器时,几个高频踩坑参数需要和MQ运维侧确认后准确填写:
- 连接工厂类选择
com.ibm.mq.jms.MQConnectionFactory,队列管理器名、通道名、服务端IP、端口、发送队列名严格按照给定参数填写,需要接收响应报文做校验的话同步填写接收队列名 - 消息类型选择
TextMessage,除非SWIFT报文做了特殊加密/压缩处理为二进制格式,否则不要选字节消息类型 - 压测场景下勾选
等待响应选项,设置合理的响应超时时间(常规场景设置10s即可) - 报文编码选择和服务端一致的字符集,一般为UTF-8或GB18030,不要用默认的ISO-8859-1,避免中文字段或特殊字符乱码
四、压测校验配置
- 添加响应断言,判断响应报文中是否包含MT541报文ACK成功标识、无约定错误码,用于统计压测请求成功率
- 可在采样器后添加JSR223后置程序,按比例抽样打印实际发送的报文到日志,校验动态字段替换是否符合预期,示例代码如下:
// 1%抽样打印发送报文到jmeter.log if (new Random().nextInt(100) == 1) { log.info("本次发送MT541报文内容:{}", prev.getSamplerData()) }
常见问题排查
- 报MQ连接类错误:优先检查客户端jar包版本和服务端是否匹配,网络策略是否放通了JMeter压测机到MQ服务端的端口
- 报文发送后被服务端拒收:先把替换完参数的报文用MQ自带的测试工具发送验证,确认报文格式本身无问题后,再检查JMeter侧的编码、报文换行符配置
- 压测TPS上不去:调整JMeter启动脚本内的堆内存参数,把
-Xmx设置为压测机物理内存的50%左右,压测执行必须用非GUI模式,不要用GUI界面跑高并发场景。
内容的提问来源于stack exchange,提问作者Akshat
相关产品推荐
相关产品推荐

