You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:27:41