Quartz 作业 运行 在同一个 JVM 中是否在它们自己的线程中?

Are Quartz jobs running in the same JVM in their own threads?

Quartz 调度程序用于在我的工作场所安排定时 java 作业。调度程序本身作为应用程序部署到 Weblogic 服务器(机器集群)。该调度程序可以调度实现 Job 接口并覆盖 execute() 方法的作业。这些作业作为库部署到 Weblogic 服务器,然后由调度程序使用。 (一个库包含多个作业。)

我没有设法找到有关这些工作如何 运行 或它们如何共享资源的信息来源。 我查看了 Quartz documentation 但找不到我要找的东西。

我有多个问题,但我相信一个答案可以涵盖所有问题。

  1. 是否所有通过调度程序创建的作业都共享一个 JVM?如果他们不这样做,那么分配给给定 JVM 的作业是基于什么?
  2. 我假设为每个作业分配了一个单独的线程 - 对吗?
  3. 如果所有计划的作业 运行 在同一个 JVM 中并且每个作业都有自己的线程,那么使用不同参数并发执行同一个作业将需要使作业线程安全或需要禁用并发执行作业,不会吧?

谢谢。

您可能想阅读 Quartz scheduler tutorial 以了解 Quartz 的工作原理。回答您的问题:

  1. 这取决于您 运行 一个 Quartz 调度器集群(即多个 Quartz 调度器实例共享同一个作业存储)还是一个独立的 Quartz 调度器实例。在集群部署中,各个 Quartz 调度程序实例通过创建数据库行锁竞争执行作业。第一个设法创建行锁的调度程序实例是执行特定作业的调度程序实例。在独立的 Quartz 调度程序部署中,完成并不存在,它始终是单个 Quartz 调度程序实例最终执行所有作业。

  2. Quartz 使用线程池,当它需要执行作业时,它只需从池中分配一个空闲线程并使用它来执行作业。作业执行完毕后,Quartzreturns将线程放回池中

  3. 不共享 Quartz 作业实施实例 class。这意味着,当 Quartz 将要执行作业时,它会实例化配置的 org.quartz.Job class 并调用其 execute 方法,将作业执行上下文作为参数传递给它。一旦作业执行完成, org.quartz.Job 实例将被丢弃并最终被垃圾收集,即它不会被 Quartz 重用。如果您的 org.quartz.Job class 声明/访问了一些静态字段、单例等,那么您可能需要在必要时同步访问这些共享资源。