如何正确取消关系任务(作为可执行脚本)?

How to cancel a nexus task properly (as executable script)?

我为一个nexus仓库写了一个清理脚本,它通过调用第三方系统的rest接口来验证一个组件是否被使用。长话短说:由于组件和网络流量的数量,此脚本的运行时间很长。所以需要取消,有了这个要求,我的问题就越来越多了。

此脚本是在 groovy 中编写的,并使用 nexus 的任务界面手动执行。使用 "Execute script" 框架创建了一个新任务。当试图停止任务时,它只在日志中声明:

admin org.sonatype.nexus.quartz.internal.task.QuartzTaskJob - Task not cancelable: 'TEST' [script]

不幸的是,nexus 的示例脚本都很简短,而且没有人使用取消功能本身。

所以在查找建议的 QuartzTaskJob 的来源时,我看到这是一个 Nexus 任务的包装器,它应该被 QuartzSchedulerSPI 自动使用。

因此我实现了它的虚拟版本,以使用已实现的任务(例如 RestoreMetadataTask)作为示例对其进行测试。首先是在其中使用 sleep() ,第二次尝试是您在下面的代码引用中看到的 for 循环。两次尝试都有同样的悲惨结局。

import org.sonatype.nexus.scheduling.Cancelable;
import org.sonatype.nexus.scheduling.TaskSupport;

public class CancelableTask
extends TaskSupport
implements Cancelable

{
    @Override
    public String getMessage(){
        return null
    }

    @Override
    protected Void execute() throws  Exception{
        log.info("Start TimeTestCancel")
        for(int i = 0; i < 1000000000000; i++){
            for(int j = 0; j < 1000000000000; j++) {
                if (isCanceled()) {
                    log.info(i)
                    break;
                }
            }
        }
        log.info("Finished TimeTestCancel")
    }
}

睡眠和循环:在 Nexus 3.7.1-02 上测试时,它只是将状态更改为 "Blocked",显示 "Stop" 按钮,但按下时再次显示 "Task not cancelable" .无法删除或更改它们。 只是循环:在 Nexus 3.21.1-01 上测试时,它执行得如此之快,我无法尝试取消它。

所以我基本上问自己我错过了什么?有没有办法将可取消的作业作为 groovy 脚本?或者我是否必须实施一个 nexus 插件来实现我的目标?

并非所有任务都可以取消。您可以在 issues.sonatype.com 中提出问题来提出要求,但是,脚本界面存在安全问题,在较新版本的 NXRM3 中不再启用。我怀疑它最终会被 REST 取代 API.