3

我有一个运行时间很长的 System Groovy 脚本,它可以启动数以万计的其他构建。为了不让构建队列过长而导致 UI 无法使用,它会监控构建队列的长度。如果构建队列长于给定阈值,它将不会启动任何新构建并休眠一分钟。

问题是,此脚本不响应用户终止操作。当用户点击 UI 上的“kill this build”按钮时,什么也没有发生。我想知道系统 Groovy 脚本是否有办法检查当前构建是否应该被杀死,所以它会退出它的睡眠和等待循环?

我试图监控 Executor.shouldRun(),但它并没有被用户的 kill 操作改变。

4

3 回答 3

3

现在刚刚处理了它,这是我的发现:

该作业被ExecutorThread.interrupt()对象中的方法取消,并且评估的 groovy 不知道它。我通过等待 评估脚本中的Executor解决了这个问题。可以从绑定参数中 检索Executor 。build

Executor executor = getBinding().getVariable('build’).getExecutor()
synchronized (executor){
   executor.wait(timeTowait)
}
于 2015-06-23T19:57:09.030 回答
0

我过去曾研究过“杀死”按钮的问题。我的理解是,kill 信号实际上是立即发送给工作的。但是,如果作业在其他一些 API(或类似的东西)中很忙,则不能保证它会被接走。但是,不会存储终止信号,作业会立即对其做出反应,或者将被忽略。当您睡一分钟时,可能就是这种情况。

因此,作为一种解决方法,我将创建自己的机制来向您的脚本发出信号,表明它应该停止。这可以通过将文件放置到特定位置(例如,groovy 脚本作业的空间)来完成。这可以通过名为 Kill_job_1 的第二个作业来完成。现在,在您的工作开始休眠之前(或在它唤醒之后),您检查该文件是否存在,如果找到该文件,则结束您的脚本。不要忘记确保在第二次开始工作时清理文件。

于 2013-10-03T20:53:14.223 回答
0

这似乎也有效

Thread.sleep(timeToWait)
于 2019-07-19T02:15:01.797 回答