我为一个nexus资源库写了一个清理脚本,通过调用第三方系统的休息接口来验证是否使用了某个组件。长话短说:由于组件和网络流量的数量,这个脚本的运行时间很大。所以它需要是可取消的,有了这个要求,我的问题也就多了起来。
这个脚本是用groovy写的,使用nexus的任务界面手动执行。使用 "执行脚本 "骨架创建了一个新的任务。当试图停止这个任务时,它只在日志中写道
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上测试时,它只是将状态改为 "阻塞",显示 "停止 "按钮,但当按下它时又显示 "任务不可取消"。无法删除或改变它们.只是循环。当在Nexus 3.21.1 -01上测试时,它的执行速度非常快,我无法尝试取消它。
所以我基本上问自己,我缺少什么?有没有一种方法可以让job作为groovy脚本来取消?还是我必须实现一个nexus插件来归档我的目标?
不是所有的任务都可以取消。 你可以在issues.sonatype.com中提交一个问题来要求这一点,然而,这个脚本接口存在安全问题,并且在NXRM3的新版本中不再启用。 我猜测它最终会被REST API取代。