如果我的Quartz调度程序运行了一堆触发器并且我想清除所有触发器,那么最好如何做到这一点?
我已经考虑过对组和名称进行迭代,在我去的时候调用非计划,但是当有数千个触发器(大约2s来取消计划10个触发器)时,这似乎非常慢。
一个基本测试用例(计划1000触发,删除100个批次)显示指数复杂度w.r.t.非计划操作的预定触发器数量:
Deleted 100 triggers in 3594ms,35.94 triggers/ms
Deleted 100 triggers in 2734ms,13.67 triggers/ms
Deleted 100 triggers in 2453ms,8.176666666666666 triggers/ms
Deleted 100 triggers in 1985ms,4.9625 triggers/ms
Deleted 100 triggers in 1547ms,3.094 triggers/ms
Deleted 100 triggers in 1281ms,2.135 triggers/ms
Deleted 100 triggers in 1047ms,1.4957142857142858 triggers/ms
Deleted 100 triggers in 765ms,0.95625 triggers/ms
Deleted 100 triggers in 485ms,0.5388888888888889 triggers/ms
Deleted 100 triggers in 156ms,0.156 triggers/ms
我找不到任何批量方法来解决问题。
我终于考虑停止调度程序并将其切换为垃圾收集,但我不确定是否还有其他任何我可能需要整理以确保它没有在任何地方引用。
有人对这里最好的方法有了看法吗?
答案 0 :(得分:2)
您将拥有多少个触发器和工作?
当触发器以类似地图的结构存储在内存中时,对于大量触发器,内存需求量很大,触发器越多,操作就越慢。
你考虑过数据库存储吗?您可以从SQL能力中获益,对一组数据进行操作并删除整组触发器,或者使用单个命令匹配模式的所有触发器。
答案 1 :(得分:1)
我认为您最好的选择是使用调度程序的shutdown
方法。如果希望在关闭调度程序之前完成所有当前正在执行的作业,则可以调用scheduler.shutdown(true)
。根据{{3}},调用shutdown 可清除与调度程序相关的所有资源。