使用JMeter进行IBM MQ测试时如何设置JMS_IBM_LAST_MSG_IN_GROUP为true
问题排查方案及遗漏配置说明
你遗漏了以下必要配置/操作,可按顺序排查:
- 必须配套设置消息组ID
JMS_IBM_LAST_MSG_IN_GROUP是IBM MQ专门用于标记消息组最后一条消息的属性,只有当你先给当前消息设置JMSXGroupID属性指定所属分组时,服务端才会识别这个标记,否则会直接忽略该配置、保留默认值false。
你需要在设置last属性前添加一行代码:
msg.setStringProperty("JMSXGroupID", "${groupid}")
- 检查Session事务配置
如果你复用的Session是开启了事务的(创建时第一个参数为true),调用producer.send()之后必须执行sess.commit()才能让所有消息属性生效,否则仅消息体被发送、自定义属性会丢失。 - 增加调试逻辑确认客户端侧设置状态
可以在send操作前添加日志打印,确认属性在客户端已经设置成功,排除代码执行异常的问题:
println("是否设置最后一条分组标记:" + msg.getBooleanProperty(JmsConstants.JMS_IBM_LAST_MSG_IN_GROUP))
- 校验队列权限配置
如果上述配置都没问题,需要联系MQ管理员确认目标队列是否开启了消息分组支持,部分受限队列会默认禁用消息分组特性,自动丢弃该属性的自定义取值。
调整后可用代码示例
import java.time.Instant import com.ibm.msg.client.jms.JmsConstants def sess = System.getProperties().get("Session") def destination = System.getProperties().get("Destination") def producer = sess.createProducer(destination) def payload = String.format('${groupid}|${sequencenumber}|rest of the payload|') def msg = sess.createTextMessage(payload) println('Payload --> ' + payload) // 新增:设置消息组ID,和你传入的groupid保持一致 msg.setStringProperty("JMSXGroupID", "${groupid}") msg.setBooleanProperty(JmsConstants.JMS_IBM_LAST_MSG_IN_GROUP,true) // 调试用:打印确认属性设置成功 println("LastMsgInGroup属性设置值:" + msg.getBooleanProperty(JmsConstants.JMS_IBM_LAST_MSG_IN_GROUP)) def start = Instant.now() producer.send(msg) // 如果Session开启了事务,取消注释下一行提交事务 // sess.commit() def stop = Instant.now() producer.close() SampleResult.setResponseData(msg.toString()) SampleResult.setDataType( org.apache.jmeter.samplers.SampleResult.TEXT) SampleResult.setLatency( stop.toEpochMilli() - start.toEpochMilli())
内容的提问来源于stack exchange,提问作者Kaushlendra Jha
相关产品推荐
相关产品推荐

