我对Quartz很新,我对作业生命周期有些怀疑。
假设我有一个工作被配置为做一些事情。
这项工作开始并结束其工作。当它再次触发它是同一个实例(可能设置为睡眠并由调度程序唤醒)或者它是一个新的作业实例(一旦作业结束它就被杀死,当再次满足触发条件时,创建一个新的作业实例) ?
我问这样的问题,因为当我调试我的应用程序(带有石英支持的Spring 3 mvc)时,我看到作业的新实例以及每次触发作业时打开SimpleThreadPool $ WorkerThreadRun()的新线程,以便SimpleThreadPool $ WorkerThreadRun()线程堆积起来,永不终止。
我只想知道这种行为是否正常,或者我一定会填满记忆; - )
有人可以给我一些解释吗?提前谢谢。
答案 0 :(得分:15)
每次想要触发该作业时,Quartz都会创建新作业类的实例。假设您有数十万个作业被安排在非常频繁地触发 - 将所有这些作业保留在内存中会浪费内存。
但是,如果您使用Spring support for Quartz,尤其是MethodInvokingJobDetailFactoryBean
,Spring将处理您作业的生命周期(它基本上会调用您的某个bean的指定方法)。但在您的申请中似乎并非如此。
当然在作业完成后没有其他引用指向它(这是正常情况),垃圾收集器最终会释放作业占用的内存。
最后关于线程 - Quartz创建了一个固定的工作线程池(参见org.quartz.threadPool.threadCount
配置选项)。每次运行作业时,Quartz可能会决定使用不同的线程 - 但不会为每个触发器创建新的线程。
答案 1 :(得分:3)
我会写关于版本2.1.5(最新版本),但对其他版本也是如此。
Job - 由“JobFactory”的某个实例创建的实例,其中包含“newJob”函数(例如SimpleJobFactory)。调用“newJob”在JobRunShell - 类的“初始化”方法中执行。 JobRunShell - 对象保存在“QuartzSchedulerThread。run”的局部变量中,而不存储在任何其他列表或字段中。
因此,新的Job - 为每个触发时间创建的实例,执行后它将被垃圾收集器正常清理。