JMeter JMS Publisher:获取运行时JMSMessageId并设为JMSCorrelationID
解决JMeter中JMS Publisher设置JMSCorrelationID为JMSMessageId的问题
默认情况下,JMSMessageId是由消息服务器(此处为ActiveMQ Artemis)在接收消息后生成的,无法在消息发布前直接获取服务器生成的JMSMessageId。要实现将JMSCorrelationID设置为与JMSMessageId一致的需求,可通过以下两种方案实现:
方案一:自定义生成JMSMessageId(推荐)
ActiveMQ Artemis允许客户端自行指定JMSMessageId,只要客户端设置了该属性,服务器就不会自动生成。我们可以提前生成唯一ID,同时赋值给JMSMessageId和JMSCorrelationID:
- 添加JSR223前置处理器:在JMS Publisher采样器下添加「JSR223前置处理器」,选择Groovy语言。
- 生成唯一ID:在前置处理器的脚本框中写入生成符合Artemis格式ID的代码(或直接用UUID生成唯一值):
// 生成符合Artemis JMSMessageId格式的唯一ID def host = InetAddress.localHost.hostName def timestamp = System.currentTimeMillis() def randomPort = new Random().nextInt(65535) def sequence = "1:1:1:1" def jmsMessageId = "ID:${host}-${randomPort}-${timestamp}-${UUID.randomUUID().toString().replace('-', '')}:${sequence}" // 将ID存入JMeter变量 vars.put("CUSTOM_JMS_MESSAGE_ID", jmsMessageId) - 配置JMS属性:在JMS Publisher采样器的「JMS Properties」区域添加两个属性:
- 键:
JMSMessageId,值:${CUSTOM_JMS_MESSAGE_ID} - 键:
JMSCorrelationID,值:${CUSTOM_JMS_MESSAGE_ID}
- 键:
发送消息后,JMSMessageId和JMSCorrelationID会使用你自定义的同一ID,满足需求。
方案二:先发送消息提取ID再复用(仅适用于后续消息关联)
如果必须使用服务器生成的JMSMessageId,只能先发送一条消息,提取返回的JMSMessageId后,再将其作为后续消息的JMSCorrelationID:
- 发送第一条消息:用JMS Publisher发送消息,在「查看结果树」中确认返回的JMSMessageId。
- 添加正则表达式提取器:在该采样器下添加「正则表达式提取器」,设置:
- 引用名称:
SERVER_JMS_MESSAGE_ID - 正则表达式:
JMSMessageId\s+ID:(.+) - 模板:
$1$
- 引用名称:
- 后续消息关联:在需要设置JMSCorrelationID的JMS Publisher采样器中,添加JMS属性:
- 键:
JMSCorrelationID,值:ID:${SERVER_JMS_MESSAGE_ID}
- 键:
这种方式无法在同一条消息发布前获取服务器生成的JMSMessageId,仅适用于跨消息的关联场景。
内容的提问来源于stack exchange,提问作者JustNatural
相关产品推荐
相关产品推荐

