JMeter测试IBM MQ发送SWIFT报文如何设置UTF-8/ASCII编码
IBM MQ JMeter发送指定编码Payload的实现说明
- 按照《Swift Message IBM MQ Testing using Jmeter》文档配置JMeter向IBM MQ发送Swift消息时,应用端存在接收失败问题
- 排查确认问题原因:当前默认以普通文本格式发送payload,应用端要求消息必须采用UTF-8或ASCII编码
- 原有创建消息的代码如下:
def msg = sess.createTextMessage(payload)
- 核心疑问:现有实现是否支持发送经过指定编码处理的payload?
结论
完全支持发送指定编码的payload,以下是两种可直接落地的实现方式:
方式1:为TextMessage手动指定编码属性(改造成本最低)
createTextMessage方法默认会使用JVM运行环境的默认字符集处理文本内容,未显式指定时大概率和应用端要求的编码不匹配。创建消息对象后可直接设置IBM MQ专属的字符集属性,强制指定消息编码,参考代码:
def msg = sess.createTextMessage(payload) // 指定消息编码为UTF-8,对应IBM MQ CCSID编码值1208;如果需要ASCII编码,将值替换为367即可 msg.setIntProperty("JMS_IBM_Character_Set", 1208) // 显式标记消息格式为文本串格式,避免应用端格式识别错误 msg.setStringProperty("JMS_IBM_Format", "MQSTR")
IBM MQ通过CCSID(Coded Character Set Identifier)识别消息编码,常用编码对应值:UTF-8为1208,US-ASCII为367,GB18030为1386,可根据业务端实际要求调整。
方式2:使用BytesMessage按指定编码传输字节(兼容性最优)
如果方式1设置后应用端仍存在编码识别异常,可绕开TextMessage的默认字符集处理逻辑,先将payload字符串按指定编码转为字节数组,再通过BytesMessage发送,参考代码:
// 按指定编码将payload转为字节数组,需要ASCII编码时将编码字符串替换为"US-ASCII" byte[] encodedPayload = payload.getBytes("UTF-8") def msg = sess.createBytesMessage() msg.writeBytes(encodedPayload) // 同步设置MQ编码属性,方便队列和应用端识别编码规则 msg.setIntProperty("JMS_IBM_Character_Set", 1208) msg.setStringProperty("JMS_IBM_Format", "MQSTR")
调整后可先在脚本中加日志打印编码转换后的字节长度、内容预览,确认编码逻辑符合预期后再发消息验证,即可解决编码不匹配导致的接收失败问题。
内容的提问来源于stack exchange,提问作者Akshat
相关产品推荐
相关产品推荐

