13

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

假设我有一个工作被配置为做一些事情。

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

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

我只是想知道这种行为是否可以,或者我一定要填满内存;-)

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

4

2 回答 2

15

Quartz 每次想要触发该作业时都会创建您的作业类的新实例。假设您有数十万个作业计划非常不频繁地触发 - 将所有这些作业保留在内存中会浪费内存。

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

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

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

于 2012-05-05T15:31:55.627 回答
3

我将写 2.1.5 版(最新版本),但其他版本也可能如此。

Job - 由具有“newJob”功能的“JobFactory”的某些实例创建的(例如SimpleJobFactory)。调用 JobRunShell 类的“initialize”方法中执行的“newJob JobRunShell - 对象保存在“ QuartzSchedulerThread .run”的局部变量中,不存储在任何其他列表或字段中。

因此,为每个触发时间创建新的Job实例,执行后它将被垃圾收集器正常清理。

于 2012-05-05T16:08:36.113 回答