Jmeter BeanShell 执行多次问题,每发送一次请求执行一次BeanShell问题

本文探讨了在JMeter中使用BeanShell时遇到的重复执行问题,详细介绍了如何通过调整脚本结构来避免线程组中每个请求导致的重复执行,最终找到了将BeanShell置于HTTP请求下的有效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jmeter BeanShell 执行多次问题,每发送一次请求执行一次BeanShell问题

前言:(此问题耗时半天)

提供解决思路的博主又有新问题了。

如图所示,写了一个BeanShell从文件中去获取值之后给测试计划的变量赋值。

问题来了,当禁用b的情况下,a只执行一次。当启用b请求的情况下,a执行了3次。

深层原因就不说了,假如线程每走一个请求都会把线程的脚本都执行一遍,那最简单的解决方式就是将a和b隔离开不就好了。

解决思路

一、把a丢到另一个线程里运行,唉!不行。两个线程是并行的,这个方式丢弃,行不通(设置线程组启动顺序及延迟启动?这个还没试过,因为已经解决了所以没有进行试验)

二、设置逻辑控制器,新增一个仅一次控制器,将a丢到控制器里。唉!不行,发现丢进去的a不运行了。

三、此点由二得来的灵感,能不能丢在http请求下呢?丢一下看看。!唉!可以!而且a只执行了一次。(完美!解决了)

 

 

 

下面提供源码:

https://www.cnblogs.com/zdfbk/p/10143354.html

 

posted on 2018-12-19 15:00 Zing_Z 阅读(...) 评论(...) 编辑 收藏

<think>我们正在使用JMeter配置一个每20天执行一次的定时任务。根据用户需求,我们需要设置一个定时器来实现这个功能。然而,JMeter本身并没有直接提供按天为单位的定时器,但我们可以通过组合使用其他定时器或借助外部调度工具来实现。 分析: 1. JMeter的定时器主要用于控制请求之间的延迟,或者模拟用户操作的等待时间,但通常用于在测试执行期间的控制,而不是用于长期调度(如按天)。 2. 对于长期调度(如每20天执行一次),我们通常不会依赖JMeter内部的定时器,而是使用操作系统的任务调度(如Linux的cron或Windows的任务计划程序)来启动JMeter测试计划。 因此,建议的解决方案是: 使用操作系统的任务计划程序来每20天运行一次JMeter测试脚本。 具体步骤(以Windows为例): 1. 编写JMeter测试脚本(.jmx文件),并确保它可以独立运行。 2. 打开Windows任务计划程序。 3. 创建一个基本任务,设置触发时间为每20天一次。 4. 操作设置为启动程序:选择jmeter.bat(或jmeter.sh,如果是Linux)并添加参数,如:`-n -t [你的测试脚本路径] -l [结果文件路径]` 但是,如果用户坚持要在JMeter内部实现,我们可以尝试使用以下方法(但请注意,这需要JMeter测试计划持续运行20天,这通常不现实): - 使用`Constant Timer`或`Gaussian Random Timer`等定时器,设置一个非常大的延迟(20天=1728000秒),但这显然不实际,因为测试计划会一直运行,而且可能遇到超时等问题。 因此,强烈建议使用操作系统的任务调度。 根据用户提供的引用: 引用[1]提到:定时器的执行优先级高于Sampler,在同一作用域下有多个定时器时,每一个定时器都会执行。但定时器主要用于控制取样器之间的等待时间,而不是用于长期调度。 引用[2]提到:同步定时器(Synchronizing Timer)用于实现并发,而不是用于长期调度。 结论:使用外部任务调度工具(如cron或Windows任务计划)来每20天运行一次JMeter测试。 配置示例(Windows任务计划): 1. 创建任务:在“操作”中选择“启动程序”。 2. 程序或脚本:填写jmeter.bat的完整路径,例如:`C:\jmeter\bin\jmeter.bat` 3. 添加参数:`-n -t "D:\test.jmx" -l "D:\result.jtl"` 4. 设置触发器:选择“按预定计划”,然后选择“每天”,重复间隔为20天。 对于Linux系统,可以使用cron作业: 编辑crontab:`crontab -e` 添加一行:`0 0 */20 * * /path/to/jmeter -n -t /path/to/test.jmx -l /path/to/result.jtl` 注意:以上方法都是通过外部调度工具来触发JMeter执行,而不是在JMeter内部设置定时器。 如果用户确实需要在JMeter测试运行期间等待20天再执行某个请求(这种情况很少见),那么可以使用以下方法(不推荐,因为测试计划需要持续运行20天): - 在需要等待的请求前添加一个`Constant Timer`,将等待时间设置为`1728000000`毫秒(20天=20*24*60*60*1000=1728000000毫秒)。但请注意,这会导致该线程阻塞20天,会占用一个线程资源,而且如果测试运行时间很长,可能会遇到内存等问题。 因此,我们强烈建议使用操作系统的任务计划。 相关问题: 1. 如何在Linux系统中设置cron作业来定时运行JMeter测试? 2. 如何在Windows任务计划中设置每隔N天执行一次任务? 3. JMeter有哪些常用的定时器?它们分别适用于什么场景?</think>### JMeter配置每20天执行一次请求的方法 在JMeter中实现每20天执行一次的定时任务,**推荐使用操作系统级调度工具**(如Windows任务计划或Linux cron),因为JMeter定时器主要用于测试执行期间的微秒级到分钟级延迟控制,不适合处理以天为单位的长周期任务。以下是具体配置方案: --- ### 方案1:通过操作系统任务调度(推荐) #### Windows系统(任务计划程序) 1. **创建基本任务**: - 操作路径:控制面板 → 管理工具 → 任务计划程序 → 创建基本任务 - 触发器设置:选择"按预定计划" → 设置为"每天",重复间隔填写`20`天 - 操作设置:启动程序选择`jmeter.bat`,参数添加: ```bash -n -t D:\test_plan.jmx -l D:\results.jtl ``` (路径替换为实际JMX脚本位置) 2. **高级配置**: - 勾选"不管用户是否登录都要运行" - 设置账户权限为系统管理员 #### Linux系统(Crontab) 编辑crontab: ```bash crontab -e ``` 添加任务(每天0点检查,每20天执行): ```bash 0 0 */20 * * /opt/jmeter/bin/jmeter -n -t /home/test_plan.jmx -l /home/results.jtl ``` --- ### 方案2:JMeter内部模拟(不推荐,仅理论可行) 若必须在JMeter内部实现,需组合定时器并持续运行测试计划,但会长期占用资源: 1. 添加**BeanShell定时器**,计算20天对应的毫秒数(`20*24*60*60*1000=1,728,000,000ms`): ```java long delay = 1728000000L; // 20天毫秒数 java.lang.Thread.sleep(delay); ``` 2. 在**循环控制器**中设置循环次数为`1`,确保只执行一次请求 ![](https://example.com/path/to/jmeter_timers.png) [^1] > ⚠️ 注意:此方案需JMeter进程持续运行20天,可能因系统重启/资源占用导致失败,仅适用于特殊场景。 --- ### 关键差异说明 | **方案** | 适用场景 | 稳定性 | 资源占用 | |----------------|------------------|--------|---------| | 操作系统任务调度 | 生产环境长期任务 | ★★★★★ | 仅在执行时占用 | | JMeter内部定时 | 短期测试验证 | ★★☆☆☆ | 持续占用线程 | > 引用说明: > [^1]: JMeter定时器优先级高于取样器,但长休眠会阻塞线程资源。 > [^2]: 高并发场景需避免测试机资源过载,长期任务更应分离调度层与执行层。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值