当一个石英作业触发时,它是一个新的作业类实例吗?

我对Quartz很新,我对工作生命周期有些怀疑。

假设我有一个单独的工作配置来做一些事情。

这项工作开始并结束其工作。 当它再次触发它是同一个实例(可能设置为睡眠并由调度程序唤醒)或者它是一个新的作业实例(一旦作业结束它就被杀死,当再次满足触发条件时,创建一个新的作业实例) ?

我问这样的问题,因为当我调试我的应用程序(带有石英支持的Spring 3 mvc)时,我看到作业的新实例和每次触发作业时打开的SimpleThreadPool $ WorkerThreadRun()的新线程,以便SimpleThreadPool $ WorkerThreadRun()线程堆积起来,永不终止。

我只是想知道这种行为是否正常还是我必须填补内存;-)

谁能给我一些解释? 提前致谢。

每次想要触发该作业时,Quartz都会创建新作业类的实例。 假设您有数十万个作业计划很少触发 – 将所有这些作业保留在内存中会浪费内存。

但是,如果您使用Quartz的Spring支持 ,特别是MethodInvokingJobDetailFactoryBean ,Spring将处理您的作业的生命周期(它基本上调用您的一个bean的指定方法)。 但在您的应用程序中似乎并非如此。

当然,在完成作业并且没有其他引用指向它(这是正常情况)之后,垃圾收集器最终将释放作业占用的内存。

最后关于线程 – Quartz创建一个固定的工作线程池(参见org.quartz.threadPool.threadCount配置选项)。 每次运行作业时,Quartz都可能决定使用不同的线程 – 但不会为每个触发器创建新的线程。

我会写关于2.1.5版本(最新版本),但对其他版本也是如此。

Job -instance由“JobFactory”的一些实例和“newJob”函数创建(例如,SimpleJobFactory)。 调用在JobRunShell -class的“initialize”方法中执行的“newJob”。 JobRunShell -object保存在“ QuartzSchedulerThread .run”的局部变量中,不存储在任何其他列表或字段中。

因此,为每个触发时间创建新的Job -instance,并且在执行之后它将被垃圾收集器正常清理。