我有一个长期运行的System Groovy脚本,可以启动数以万计的其他版本。为了不使构建队列过长,这会使UI无法使用,它会监视构建队列的长度。如果构建队列长于给定阈值,它将不会启动任何新构建并在一分钟内休眠。
问题是,此脚本不响应用户终止操作。当用户单击UI上的“kill this build”按钮时,没有任何反应。我想知道系统Groovy脚本是否有办法检查当前的构建是否应该被杀死,所以它会退出睡眠和等待循环吗?
我试图监视Executor.shouldRun(),但用户的kill操作不会改变它。
答案 0 :(得分:2)
现在就处理好了,这是我的发现:
Executor对象中的Thread.interrupt()
方法取消了该作业,并且评估的groovy并未意识到该作业。我通过等待评估脚本中的Executor来解决它。可以从绑定的build
参数中检索Executor。
Executor executor = getBinding().getVariable('build’).getExecutor()
synchronized (executor){
executor.wait(timeTowait)
}
答案 1 :(得分:0)
我过去常常使用“杀戮”按钮查看问题。我的理解是,杀戮信号实际上是立即发送给工作的。但是,如果作业在某些其他API(或该行中的某些内容)中忙碌,则不保证它将被拾取。但是,不会存储终止信号,或者作业立即对其作出反应,否则将被忽略。当你睡一分钟时,这可能就是这种情况。
因此,作为一种解决方法,我会创建自己的机制来向您的脚本发出信号,告知它应该停止。这可以通过将文件放入特定位置(例如groovy脚本作业的恶劣空间)来完成。这可以通过名为Kill_job_1的第二个作业完成。现在,在你的工作开始睡眠之前(或者在它醒来之后),检查是否存在该文件并在找到文件时结束你的脚本。不要忘记确保在第二次开始工作时清理文件。
答案 2 :(得分:0)
这似乎也可行
Thread.sleep(timeToWait)