【问题标题】:Are Quartz jobs running in the same JVM in their own threads?Quartz 作业是否在它们自己的线程中运行在同一个 JVM 中?
【发布时间】:2020-05-31 22:06:40
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

标签: java quartz


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多