我计划使用Quartz调度程序处理一次性作业。
我的用例是,我需要将BLOB从一个存储迁移到另一个存储,并且blob可以大到100GB,因此特定的工作可以运行足够长的时间来完成工作。
我之所以使用Quartz是因为它的集群支持,容错和重试能力,以防作业失败等。我唯一担心的是,我可能会有很多错过触发器的情况以及许多数据库锁定可能会妨碍这些数据库主机上的实时生产流量。我可能会一次性安排成千上万的工作。
我想到的事情很少是
我可以为org.quartz.jobStore.misfireThreshold
设置一个较高的值,以便不会发生未命中。我并不十分关心工作被当作背景工作而没有SLA的时间。我唯一关心的是最终找到工作并完成工作。
我还可以设置批处理模式属性org.quartz.scheduler.batchTriggerAcquisitionMaxCount
和org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow
。我理解批处理最大计数属性应该等于线程池大小,这可以给出最大的性能,但是提前的窗口值应该是什么?
我正在使用Quartz和Spring启动,并将利用org.quartz.impl.jdbcjobstore.JobStoreCMT
。我所理解的是在事务中包含作业的执行方法,这会导致任何问题,因为事务将长时间打开,因为这个工作可能需要几个小时才能完成?这件事好吗?我将使用Oracle数据库。
我在这里遗漏了什么吗?有人可以与类似的用例分享他们的经验吗?
谢谢!