一、问题描述
调度中有一个启动调度的开关,打开后,工作流会按照设定的定时时间,定时调度。但是线上偶发性开关打开了,工作流没有被掉起,或者是开关关闭了,定时任务在后台持续进行。
二、追根溯源:
代码中,是这么实现的:
(1)点击定时开关后,会先将数据库中的状态修改;
(2)再清除/插入数据入crontab表。
因此当第2步因为网络或者是其他原因失败时,虽然捕获了异常,并设置了flag = false,但是对该函数的返回值flag并没有进行判断,导致界面上虽然关闭了,但是实际上定时任务并没有被清除。
改造后的程序:
三、启发
这种很掩蔽的问题如何去发现呢,这要求我们测试了解开发的实现逻辑,并对于这种应该具有原子性的操作进行白盒测试。