java - Quartz 作业是否在同一个 JVM 中以自己的线程运行?

标签 java quartz

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

我尚未找到有关这些作业如何运行或如何共享资源的信息来源。 我看了看 quartz documentation但找不到我要找的东西。

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

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

谢谢。

最佳答案

您可能想阅读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 类声明/访问一些静态字段、单例等,那么您可能需要在必要时同步对这些共享资源的访问。

关于java - Quartz 作业是否在同一个 JVM 中以自己的线程运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62123052/

相关文章:

java - Android 不启动默认 Activity (MainActivity)

java - 无法从数据源获取数据库连接

java - 测试 Camel quartz 路线

java - quartz如何保证只有一个节点运行作业

java - Scala lambdas 实现与 Java 8

java - 删除下载目录中的文件

java - 在java中使用If then else正则表达式构造捕获组

java - 使用 google guava 时无法推断类型变量 V

spring-boot - 使用 Spring Boot 在 Quartz 中触发器自动进入错误状态

java - 是否可以通过配置文件激活或停用作业以避免意外启动?