JMeter并行发布ActiveMQ Artemis消息:序列ID验证方案咨询
针对ActiveMQ Artemis序列消息负载测试的实现方案
初始方案验证
你提出的Set-up线程组+测试线程组的架构是可行的,核心逻辑没问题:
- Set-up线程组通过JDBC Sampler从DB获取初始序列ID,用
${__setProperty(initialSequenceID, ${查询结果变量},)}存入JMeter全局属性。 - 测试线程组通过用户定义变量读取全局属性,再用Global Counter配置元件初始化全局计数器,确保多线程下每个请求拿到唯一递增的序列值(你测试过该逻辑有效,这一步是对的)。
核心难点:线程等待DB序列匹配的实现
针对每个线程需轮询DB直到序列匹配再发消息的需求,可通过以下JMeter组件组合实现:
1. 循环控制与超时处理
使用While Controller实现重试逻辑,设置循环条件为:
${__jexl3(${currentThreadCounter} != ${dbCurrentSequence} && ${__jm__While Controller__idx} < 10 && ${__time() - ${startTime} < 5000},)}
解释:
${currentThreadCounter}:全局计数器生成的线程唯一序列值${dbCurrentSequence}:JDBC查询到的DB当前序列值${__jm__While Controller__idx} < 10:最多重试10次${__time() - ${startTime} < 5000}:超时5秒后停止重试(需在线程开始时用${__time(startTime,)}记录起始时间)
2. DB序列查询
在While Controller内添加JDBC Sampler,执行查询当前DB序列的SQL(根据数据库类型调整):
- PostgreSQL:
SELECT currval('your_sequence_name'); - MySQL:
SELECT 349667;(或对应序列查询语句)
将查询结果存入变量dbCurrentSequence(通过JDBC Sampler的“Variable names”配置)。
3. 匹配判断与消息发送
添加If Controller,条件设为:
${__jexl3(${currentThreadCounter} == ${dbCurrentSequence},)}
在If Controller内放置ActiveMQ Artemis Publisher Sampler,将${currentThreadCounter}作为消息的唯一序列ID传入消息体或头信息。
4. 重试间隔控制
在While Controller内添加Fixed Timer,设置延迟100-500ms,避免频繁查询压垮数据库。
可选:用Groovy脚本实现更灵活逻辑
如果需要更精细的控制,可使用JSR223 Sampler(选择Groovy语言)编写重试逻辑:
def currentCounter = vars.get('currentThreadCounter') as Long def timeout = 5000 def startTime = System.currentTimeMillis() def dbSequence = null while (System.currentTimeMillis() - startTime < timeout) { // 执行DB查询(可复用JDBC Sampler的结果,或直接在脚本中建立DB连接查询) dbSequence = vars.get('dbCurrentSequence') as Long if (dbSequence == currentCounter) { vars.put('canSend', 'true') break } sleep(100) } if (!vars.get('canSend')) { vars.put('canSend', 'false') SampleResult.setSuccessful(false) SampleResult.setResponseMessage("Timeout waiting for sequence match") }
之后用If Controller判断${canSend} == 'true'再执行消息发送。
注意事项
- 确保JDBC Connection Configuration的连接池大小足够,避免查询时出现连接耗尽。
- 全局计数器需设置为全局共享(不要勾选“Track counter independently for each user”),保证序列值全局唯一。
- 若DB序列递增速度远慢于线程发送请求的速度,会导致大量重试,建议调整线程数或重试间隔,避免负载测试结果失真。
内容的提问来源于stack exchange,提问作者JustNatural
相关产品推荐
相关产品推荐

