Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当启动quartz作业时,它是新的作业类实例吗?_Java_Quartz Scheduler_Spring 3_Job Scheduling - Fatal编程技术网

Java 当启动quartz作业时,它是新的作业类实例吗?

Java 当启动quartz作业时,它是新的作业类实例吗?,java,quartz-scheduler,spring-3,job-scheduling,Java,Quartz Scheduler,Spring 3,Job Scheduling,我对石英非常陌生,我对工作的生命周期有些怀疑 让我们假设我配置了一个作业来做一些事情 这项工作开始并结束。当它再次触发时,它是同一个实例(可能被调度程序设置为睡眠和唤醒)还是一个新作业实例(一旦作业结束,它将被终止,并且当触发条件再次满足时,将创建一个新作业实例) 我问这样的问题是因为当我调试我的应用程序(支持quartz的spring 3 mvc)时,每次启动作业时都会看到作业的新实例和SimpleThreadPool$WorkerThreadRun()打开的新线程,这样SimpleThrea

我对石英非常陌生,我对工作的生命周期有些怀疑

让我们假设我配置了一个作业来做一些事情

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

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

我只是想知道这种行为是否正确,或者我一定要填满记忆;-)


谁能给我解释一下吗?提前感谢。

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

但是,如果您正在使用,特别是,Spring将处理您的作业的生命周期(它基本上调用您的一个bean的指定方法)。但在你的申请中似乎不是这样

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


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

我将介绍2.1.5版(最新版本),但对于其他版本也可能如此

-由“JobFactory”的某个实例使用“newJob”-函数创建的实例(,例如)。在类的“initialize”-方法中执行对“newJob”的调用-对象保存在“.run”的局部变量中,不存储在任何其他列表或字段中


因此,每次触发时都会创建一个新实例,执行后垃圾收集器会正常清理它。

非常感谢。你的解释简单明了,这正是我真正需要的!实际上,在我的应用程序中,我使用的是
JobDetailBean
CronTriggerBean
SchedulerFactoryBean
,但在阅读您的答案时,我认为生命周期也由spring处理,没有内存故障的危险。关于“调用JobDetailFactoryBean的方法”。Spring将处理bean的生命周期,该bean的方法将从Quartz作业调用(实现“org.Quartz.job”接口,Spring中“QuartzJobBean”抽象类的子类)。这个Quartz作业实例将按照我的回答中的描述创建。Hello@tomasz,您能告诉我如何在JSP中单击一个按钮时调用doIt()方法(例如来自Spring文档)吗。我正在使用Quartz job,但我的job类的execute()方法未被调用。我使用带有一些触发器的MethodInvokingJobDetailFactoryBean和带有SchedulerFactoryBean的jobDetails,但它们是在某个固定时间间隔上调用的,而不是按需调用的。谢谢