我为 Nexus 存储库编写了一个清理脚本,该脚本通过调用第三方系统的剩余接口(interface)来验证是否使用了组件。长话短说:由于组件数量和网络流量的原因,该脚本的运行时间很长。所以它需要可以取消,随着这个要求,我的问题越来越多。
该脚本是用groovy编写的,并使用nexus的任务接口(interface)手动执行。使用“执行脚本”骨架创建了一个新任务。当尝试停止任务时,它仅在日志中指出:
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")
}
}
sleep 和循环:在 Nexus 3.7.1-02 上测试时,它只是将状态更改为“已阻止”,显示“停止”按钮,但按下该按钮时再次显示“任务不可取消”。无法删除或更改它们。 只是循环:在 Nexus 3.21.1-01 上测试时,它执行得非常快,我无法尝试取消它。
所以我基本上问自己我错过了什么?有没有办法将可取消的作业作为常规脚本来使用?或者我是否必须实现一个 Nexus 插件来实现我的目标?
最佳答案
并非所有任务都可以取消。您可以在 issues.sonatype.com 中提出问题来询问此问题,但是,脚本接口(interface)存在安全问题,并且在较新版本的 NXRM3 中不再启用。我怀疑它最终会被 REST API 取代。
关于java - 如何正确取消 Nexus 任务(作为可执行脚本)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61319315/