我们在几个应用程序节点上集成了Quartz调度程序运行程序。应用程序节点需要更新,出于高可用性原因,更新将作为滚动更新完成。
与更新一起,我们需要添加一个新作业,并且该作业需要立即开始运行 - 即它不能等到所有节点都已更新。问题是我can't control which node will run the new job,如果其中一个旧节点运行作业,作业实例化将会出现问题(使用ClassNotFoundException),trigger will be set to the state ERROR并且作业将不再运行。
此问题的一个解决方案是执行两个更新:一个用于在所有节点中添加类,另一个用于添加触发器。反对这种方法的主要原因是我们的操作程序不支持这一点。
那么还有一种方法可以安排新作业,并通过一次更新使其可靠运行吗?
答案 0 :(得分:1)
我刚尝试过,结果发现Quartz在尝试获取触发器时获得了ClassCastException。异常被包装到JobPersistenceException中,触发器处于WAITING状态。
因此,尽管这可能会导致其中一个旧节点出现错误日志条目,但Quartz不会将触发器置于非工作状态。