调试JMeter线程间通信插件FIFO队列时遇异常行为
JMeter线程间通信插件FIFO队列问题解析
问题1:前置处理器执行时队列未创建却未报错且队列已存在
线程间通信插件的所有FIFO相关函数(包括调试用的队列状态查询类函数)都自带自动创建队列的逻辑——只要通过函数引用了某个不存在的队列名,插件会立即初始化该队列,不会抛出“队列不存在”的异常。
你的前置处理器和后置处理器用了相同的调试代码,而调试代码必然包含对目标队列的访问操作(比如查询队列长度、读取队列内容等),这就导致前置处理器执行时,插件自动创建了对应的队列,所以你看到队列已经存在。
问题2:仅调用一次__fifoPut却添加了两个条目
这是JMeter JSR223元件的特性导致的:当你在JSR223 Sampler的脚本中直接使用${__fifoPut(...)}这种JMeter函数语法时,函数会被执行两次——第一次是脚本的编译阶段(JMeter会提前解析所有${}包裹的函数),第二次是脚本的实际执行阶段。两次执行__fifoPut自然会向队列添加两个条目。
解决这个问题的正确做法是在JSR223脚本中用Groovy代码直接调用插件的API,避免函数被重复解析:
// 方式1:通过API直接操作队列 def queueName = props.get("targetFIFOQueueName") def fifoQueue = org.apache.jmeter.threads.JMeterContextService.getContext().getSamplerContext().get("fifo." + queueName) if (!fifoQueue) { fifoQueue = new java.util.LinkedList() org.apache.jmeter.threads.JMeterContextService.getContext().getSamplerContext().put("fifo." + queueName, fifoQueue) } fifoQueue.add("variable1")
或者:
// 方式2:调用函数的Java API,避免双重解析 def args = [props.get("targetFIFOQueueName"), "variable1"] as String[] new org.apache.jmeter.functions.FifoPutFunction().execute(args, null)
内容的提问来源于stack exchange,提问作者JustNatural
相关产品推荐
相关产品推荐

