编辑此页面

使用 Quartz 调度周期性任务

现代应用程序通常需要定期运行特定任务。在本指南中,您将学习如何使用 Quartz 扩展来调度周期性的集群任务。

如果您只需要运行内存调度程序,请使用 Scheduler 扩展。

先决条件

要完成本指南,您需要

  • 大约 15 分钟

  • 一个 IDE

  • 已安装 JDK 17+ 并正确配置了 JAVA_HOME

  • Apache Maven 3.9.9

  • Docker 和 Docker Compose 或 Podman,以及 Docker Compose

  • 如果您想使用它,可以选择 Quarkus CLI

  • 如果您想构建本机可执行文件(或者如果您使用本机容器构建,则为 Docker),可以选择安装 Mandrel 或 GraalVM 并进行适当的配置

架构

在本指南中,我们将公开一个名为 tasks 的 REST API,用于可视化 Quartz 作业每 10 秒运行一次所创建的任务列表。

解决方案

我们建议您按照以下章节中的说明,逐步创建应用程序。但是,您可以直接转到完整的示例。

克隆 Git 存储库:git clone https://github.com/quarkusio/quarkus-quickstarts.git,或下载 存档

解决方案位于 quartz-quickstart 目录中。

创建 Maven 项目

首先,我们需要一个新项目。使用以下命令创建一个新项目

CLI
quarkus create app org.acme:quartz-quickstart \
    --extension='rest-jackson,quartz,hibernate-orm-panache,flyway,jdbc-postgresql' \
    --no-code
cd quartz-quickstart

要创建 Gradle 项目,请添加 --gradle--gradle-kotlin-dsl 选项。

有关如何安装和使用 Quarkus CLI 的更多信息,请参阅 Quarkus CLI 指南。

Maven
mvn io.quarkus.platform:quarkus-maven-plugin:3.24.4:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=quartz-quickstart \
    -Dextensions='rest-jackson,quartz,hibernate-orm-panache,flyway,jdbc-postgresql' \
    -DnoCode
cd quartz-quickstart

要创建 Gradle 项目,请添加 -DbuildTool=gradle-DbuildTool=gradle-kotlin-dsl 选项。

对于 Windows 用户

  • 如果使用 cmd,(不要使用反斜杠 \ 并将所有内容放在同一行上)

  • 如果使用 Powershell,请将 -D 参数用双引号括起来,例如 "-DprojectArtifactId=quartz-quickstart"

它生成

  • Maven 结构

  • 一个可以在 https://:8080 上访问的欢迎页面

  • 用于 nativejvm 模式的示例 Dockerfile 文件

  • 应用程序配置文件

Maven 项目还导入了 Quarkus Quartz 扩展。

如果您已配置好 Quarkus 项目,可以通过在项目根目录中运行以下命令将 quartz 扩展添加到您的项目中:

CLI
quarkus extension add quartz
Maven
./mvnw quarkus:add-extension -Dextensions='quartz'
Gradle
./gradlew addExtension --extensions='quartz'

这会将以下内容添加到您的构建文件中

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-quartz</artifactId>
</dependency>
build.gradle
implementation("io.quarkus:quarkus-quartz")

要使用 JDBC 存储,还需要提供数据源支持的 quarkus-agroal 扩展。

创建任务实体

org.acme.quartz 包中,创建 Task 类,内容如下:

package org.acme.quartz;

import jakarta.persistence.Entity;
import java.time.Instant;
import jakarta.persistence.Table;

import io.quarkus.hibernate.orm.panache.PanacheEntity;

@Entity
@Table(name="TASKS")
public class Task extends PanacheEntity { (1)
    public Instant createdAt;

    public Task() {
        createdAt = Instant.now();
    }

    public Task(Instant time) {
        this.createdAt = time;
    }
}
1 使用 Panache 声明实体。

创建计划任务

org.acme.quartz 包中,创建 TaskBean 类,内容如下:

package org.acme.quartz;

import jakarta.enterprise.context.ApplicationScoped;

import jakarta.transaction.Transactional;

import io.quarkus.scheduler.Scheduled;

@ApplicationScoped (1)
public class TaskBean {

    @Transactional
    @Scheduled(every = "10s", identity = "task-job") (2)
    void schedule() {
        Task task = new Task(); (3)
        task.persist(); (4)
    }
}
1 application 作用域中声明 bean。
2 使用 @Scheduled 注解指示 Quarkus 每 10 秒运行一次此方法,并为此作业设置唯一标识符。
3 创建一个新的 Task 并记录当前开始时间。
4 使用 Panache 将任务持久化到数据库。

以编程方式调度作业

可以注入 io.quarkus.scheduler.Scheduler以编程方式调度作业。但是,也可以直接利用 Quartz API。您可以在任何 bean 中注入底层的 org.quartz.Scheduler

package org.acme.quartz;

@ApplicationScoped
public class TaskBean {

    @Inject
    org.quartz.Scheduler quartz; (1)

    void onStart(@Observes StartupEvent event) throws SchedulerException {
       JobDetail job = JobBuilder.newJob(MyJob.class)
                         .withIdentity("myJob", "myGroup")
                         .build();
       Trigger trigger = TriggerBuilder.newTrigger()
                            .withIdentity("myTrigger", "myGroup")
                            .startNow()
                            .withSchedule(
                               SimpleScheduleBuilder.simpleSchedule()
                                  .withIntervalInSeconds(10)
                                  .repeatForever())
                            .build();
       quartz.scheduleJob(job, trigger); (2)
    }

    @Transactional
    void performTask() {
        Task task = new Task();
        task.persist();
    }

    // A new instance of MyJob is created by Quartz for every job execution
    public static class MyJob implements Job {

       @Inject
       TaskBean taskBean;

       public void execute(JobExecutionContext context) throws JobExecutionException {
          taskBean.performTask(); (3)
       }

    }
}
1 注入底层的 org.quartz.Scheduler 实例。
2 使用 Quartz API 调度新作业。
3 从作业调用 TaskBean#performTask() 方法。如果作业属于 bean 存档,它们也是 容器管理的 bean。
默认情况下,除非找到 @Scheduled 业务方法,否则调度程序不会启动。您可能需要强制启动调度程序以进行“纯”编程调度。另请参阅 Quartz 配置参考

更新应用程序配置文件

编辑 application.properties 文件并添加以下配置:

# Quartz configuration
quarkus.quartz.clustered=true (1)
quarkus.quartz.store-type=jdbc-cmt (2)
quarkus.quartz.misfire-policy.task-job=ignore-misfire-policy (3)

# Datasource configuration.
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=quarkus_test
quarkus.datasource.password=quarkus_test
quarkus.datasource.jdbc.url=jdbc:postgresql:///quarkus_test

# Hibernate configuration
quarkus.hibernate-orm.schema-management.strategy=none
quarkus.hibernate-orm.log.sql=true
quarkus.hibernate-orm.sql-load-script=no-file

# flyway configuration
quarkus.flyway.connect-retries=10
quarkus.flyway.table=flyway_quarkus_history
quarkus.flyway.migrate-at-start=true
quarkus.flyway.baseline-on-migrate=true
quarkus.flyway.baseline-version=1.0
quarkus.flyway.baseline-description=Quartz
1 指示调度程序将在集群模式下运行。
2 使用数据库存储来持久化与作业相关的信息,以便它们可以在节点之间共享。
3 可以为每个作业配置其遗漏策略。task-job 是作业的标识符。

cron 作业的有效遗漏策略包括:smart-policyignore-misfire-policyfire-nowcron-trigger-do-nothing。间隔作业的有效遗漏策略包括:smart-policyignore-misfire-policyfire-nowsimple-trigger-reschedule-now-with-existing-repeat-countsimple-trigger-reschedule-now-with-remaining-repeat-countsimple-trigger-reschedule-next-with-existing-countsimple-trigger-reschedule-next-with-remaining-count

创建 REST 资源和测试

创建 org.acme.quartz.TaskResource 类,内容如下:

package org.acme.quartz;

import java.util.List;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/tasks")
public class TaskResource {

    @GET
    public List<Task> listAll() {
        return Task.listAll(); (1)
    }
}
1 从数据库检索已创建任务的列表。

您还可以选择创建一个 org.acme.quartz.TaskResourceTest 测试,内容如下:

package org.acme.quartz;

import io.quarkus.test.junit.QuarkusTest;

import static org.hamcrest.Matchers.greaterThanOrEqualTo;

import org.junit.jupiter.api.Test;

import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;

@QuarkusTest
public class TaskResourceTest {

    @Test
    public void tasks() throws InterruptedException {
        Thread.sleep(1000); // wait at least a second to have the first task created
        given()
                .when().get("/tasks")
                .then()
                .statusCode(200)
                .body("size()", is(greaterThanOrEqualTo(1))); (1)
    }
}
1 确保我们获得 200 响应并且至少创建了一个任务。

创建 Quartz 表

添加一个名为 src/main/resources/db/migration/V2.0.0__QuarkusQuartzTasks.sql 的 SQL 迁移文件,其内容从 V2.0.0__QuarkusQuartzTasks.sql 文件复制。

配置负载均衡器

在根目录中,创建一个 nginx.conf 文件,内容如下:

user  nginx;

events {
    worker_connections   1000;
}

http {
        server {
              listen 8080;
              location / {
                proxy_pass http://tasks:8080; (1)
              }
        }
}
1 将所有流量路由到我们的任务应用程序。

设置应用程序部署

在根目录中,创建一个 docker-compose.yml 文件,内容如下:

version: '3'

services:
  tasks: (1)
    image: quarkus-quickstarts/quartz:1.0
    build:
      context: ./
      dockerfile: src/main/docker/Dockerfile.${QUARKUS_MODE:-jvm}
    environment:
      QUARKUS_DATASOURCE_URL: jdbc:postgresql://postgres/quarkus_test
    networks:
      - tasks-network
    depends_on:
      - postgres

  nginx: (2)
    image: nginx:1.17.6
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - tasks
    ports:
      - 8080:8080
    networks:
      - tasks-network

  postgres: (3)
    image: postgres:14.1
    container_name: quarkus_test
    environment:
      - POSTGRES_USER=quarkus_test
      - POSTGRES_PASSWORD=quarkus_test
      - POSTGRES_DB=quarkus_test
    ports:
      - 5432:5432
    networks:
      - tasks-network

networks:
  tasks-network:
    driver: bridge
1 定义任务服务。
2 定义 nginx 负载均衡器以将传入流量路由到适当的节点。
3 定义运行数据库的配置。

运行数据库

在单独的终端中,运行以下命令:

docker-compose up postgres (1)
1 使用 docker-compose.yml 文件中提供的配置选项启动数据库实例。

在开发模式下运行应用程序

使用以下命令运行应用程序

CLI
quarkus dev
Maven
./mvnw quarkus:dev
Gradle
./gradlew --console=plain quarkusDev

几秒钟后,打开另一个终端并运行 curl localhost:8080/tasks 以验证是否至少创建了一个任务。

与往常一样,可以使用以下命令打包应用程序

CLI
quarkus build
Maven
./mvnw install
Gradle
./gradlew build

并使用 java -jar target/quarkus-app/quarkus-run.jar 执行。

您还可以使用以下命令生成原生可执行文件

CLI
quarkus build --native
Maven
./mvnw install -Dnative
Gradle
./gradlew build -Dquarkus.native.enabled=true

打包应用程序并运行多个实例

可以使用以下命令打包应用程序:

CLI
quarkus build
Maven
./mvnw install
Gradle
./gradlew build

构建成功后,运行以下命令:

docker-compose up --scale tasks=2 --scale nginx=1 (1)
1 启动应用程序的两个实例和一个负载均衡器。

几秒钟后,在另一个终端中运行 curl localhost:8080/tasks,以验证任务仅在不同时间点以 10 秒的间隔创建。

您还可以使用以下命令生成原生可执行文件

CLI
quarkus build --native
Maven
./mvnw install -Dnative
Gradle
./gradlew build -Dquarkus.native.enabled=true
部署者负责清除/删除先前状态,即陈旧的作业和触发器。此外,组成“Quartz 集群”的应用程序应相同,否则可能会出现不可预测的结果。

配置实例 ID

默认情况下,调度程序配置了一个简单的实例 ID 生成器,使用机器主机名和当前时间戳,因此在集群模式下运行时,您无需担心为每个节点设置适当的 instance-id。但是,您可以通过设置配置属性引用或使用其他生成器来自行定义特定的 instance-id

quarkus.quartz.instance-id=${HOST:AUTO} (1)
1 这将展开 HOST 环境变量,如果 HOST 未设置,则使用 AUTO 作为默认值。

以下示例配置了名为 hostname 的生成器 org.quartz.simpl.HostnameInstanceIdGenerator,因此您可以使用其名称作为 instance-id。该生成器仅使用机器主机名,在提供节点唯一名称的环境中可能很合适。

quarkus.quartz.instance-id=hostname
quarkus.quartz.instance-id-generators.hostname.class=org.quartz.simpl.HostnameInstanceIdGenerator
部署者负责定义适当的实例标识符。此外,组成“Quartz 集群”的应用程序应包含唯一的实例标识符,否则可能会出现不可预测的结果。建议使用适当的实例 ID 生成器,而不是指定显式标识符。

注册插件和监听器

您可以通过 Quarkus 配置注册 pluginsjob-listenerstrigger-listeners

以下示例注册了名为 jobHistory 的插件 org.quartz.plugins.history.LoggingJobHistoryPlugin,并将属性 jobSuccessMessage 定义为 Job [{1}.{0}] execution complete and reports: {8}

quarkus.quartz.plugins.jobHistory.class=org.quartz.plugins.history.LoggingJobHistoryPlugin
quarkus.quartz.plugins.jobHistory.properties.jobSuccessMessage=Job [{1}.{0}] execution complete and reports: {8}

您还可以使用注入的 org.quartz.Scheduler 以编程方式注册监听器。

public class MyListenerManager {
    void onStart(@Observes StartupEvent event, org.quartz.Scheduler scheduler) throws SchedulerException {
        scheduler.getListenerManager().addJobListener(new MyJogListener());
        scheduler.getListenerManager().addTriggerListener(new MyTriggerListener());
    }
}

在虚拟线程上运行计划方法

@Scheduled 注解标记的方法也可以用 @RunOnVirtualThread 注解标记。在这种情况下,方法将在虚拟线程上调用。

该方法必须返回 void,并且您的 Java 运行时必须支持虚拟线程。有关更多详细信息,请阅读 虚拟线程指南

此功能不能与 run-blocking-method-on-quartz-thread 选项结合使用。如果设置了 run-blocking-method-on-quartz-thread,则计划方法将在 Quartz 管理的(平台)线程上运行。

Quartz 配置参考

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

启用或禁用集群模式。

如果启用,请确保设置适当的集群属性。

环境变量:QUARKUS_QUARTZ_CLUSTERED

显示更多

布尔值

false

调度程序实例与集群中的其他实例进行检查的频率(以毫秒为单位)。

如果使用 ram 存储(即 StoreType#RAM)则忽略。

环境变量:QUARKUS_QUARTZ_CLUSTER_CHECKIN_INTERVAL

显示更多

long

15000

要使用的存储类型。

使用 StoreType#JDBC_CMTStoreType#JDBC_TX 配置值时,请确保已配置数据源。有关更多信息,请参阅 配置数据源

要创建 Quartz 表,您可以通过 Flyway 扩展执行模式迁移,使用与您的数据库匹配的 SQL 脚本,该脚本可从 Quartz 存储库 中选择。

环境变量:QUARKUS_QUARTZ_STORE_TYPE

显示更多

ramjdbc-txjdbc-cmt

ram

要使用的线程池实现的类名。

需要注意的是,Quartz 线程不用于执行计划方法,而是默认使用常规 Quarkus 线程池。另请参阅 quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread

环境变量:QUARKUS_QUARTZ_THREAD_POOL_CLASS

显示更多

字符串

org.quartz.simpl.SimpleThreadPool

要使用的数据源的名称。

如果使用 ram 存储(即 StoreType#RAM)则忽略。

使用 jdbc-txjdbc-cmt 存储类型时可选。如果未指定,则默认为使用默认数据源。

环境变量:QUARKUS_QUARTZ_DATASOURCE

显示更多

字符串

Quartz 作业存储表的表名前缀。

如果使用 ram 存储(即 StoreType#RAM)则忽略。

环境变量:QUARKUS_QUARTZ_TABLE_PREFIX

显示更多

字符串

QRTZ_

用于在“LOCKS”表中选择一行并锁定该行的 SQL 字符串。

如果使用 ram 存储(即 StoreType#RAM)则忽略。

如果未设置,则应用 Quartz 的默认值,其中 {0} 在运行时会被 table-prefix 替换,{1} 会被 instance-name 替换。

一个示例 SQL 字符串:SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE

环境变量:QUARKUS_QUARTZ_SELECT_WITH_LOCK_SQL

显示更多

字符串

允许用户为自定义 JDBC 驱动程序代理指定完全限定的类名。

此属性是可选的,如果留空,Quarkus 将自动选择合适的默认驱动程序代理实现。

请注意,任何自定义实现都必须是现有 Quarkus 实现的子类,例如 io.quarkus.quartz.runtime.jdbc.QuarkusPostgreSQLDelegateio.quarkus.quartz.runtime.jdbc.QuarkusMSSQLDelegate

环境变量:QUARKUS_QUARTZ_DRIVER_DELEGATE

显示更多

字符串

指示 JDBCJobStore 在 BLOB 列中序列化 JobDataMaps。

如果使用 ram 存储(即 StoreType#RAM)则忽略。

如果设置为 true,JDBCJobStore 将在 BLOB 列中以序列化形式存储 JobDataMaps。当您想存储 String 以外的复杂 JobData 对象时,这很有用。这相当于将 org.quartz.jobStore.useProperties 设置为 false注意:当此选项设置为 true 时,JobDataMaps 中使用的所有非 String 类都必须在构建原生映像时注册进行序列化

如果设置为 false(默认值),则值可以存储为名称-值对,而不是在 BLOB 列中以序列化形式存储更复杂的对象。这可能很方便,因为您可以避免序列化非 String 类到 BLOB 时可能出现的类版本冲突问题。这相当于将 org.quartz.jobStore.useProperties 设置为 true

环境变量:QUARKUS_QUARTZ_SERIALIZE_JOB_DATA

显示更多

布尔值

false

Quartz 实例的名称。

环境变量:QUARKUS_QUARTZ_INSTANCE_NAME

显示更多

字符串

QuarkusQuartzScheduler

Quartz 实例的标识符,该标识符必须在所有作为同一逻辑调度程序工作的调度程序之间是唯一的。使用默认值 AUTO 或其中一个已配置的 实例 ID 生成器,如果您希望标识符为您生成。

环境变量:QUARKUS_QUARTZ_INSTANCE_ID

显示更多

字符串

AUTO

调度程序允许在计划触发时间之前获取和触发触发器的时间量(以毫秒为单位)。

环境变量:QUARKUS_QUARTZ_BATCH_TRIGGER_ACQUISITION_FIRE_AHEAD_TIME_WINDOW

显示更多

long

0

调度程序节点一次允许获取(用于触发)的最大触发器数量。

环境变量:QUARKUS_QUARTZ_BATCH_TRIGGER_ACQUISITION_MAX_COUNT

显示更多

整数

1

调度程序线程池的大小。这将初始化池中的工作线程数量。

需要注意的是,Quartz 线程不用于执行计划方法,而是默认使用常规 Quarkus 线程池。另请参阅 quarkus.quartz.run-blocking-scheduled-method-on-quartz-thread

环境变量:QUARKUS_QUARTZ_THREAD_COUNT

显示更多

整数

10

线程池中工作线程的线程优先级。

环境变量:QUARKUS_QUARTZ_THREAD_PRIORITY

显示更多

整数

5

定义调度程序延迟多久才被视为遗漏。

环境变量:QUARKUS_QUARTZ_MISFIRE_THRESHOLD

显示更多

Duration 

60S

Quarkus 将等待当前正在运行的作业完成的最大时间。如果值为 0,则 Quarkus 不会等待这些作业完成 - 在这种情况下,它将调用 org.quartz.Scheduler.shutdown(false)

环境变量:QUARKUS_QUARTZ_SHUTDOWN_WAIT_TIME

显示更多

Duration 

10S

此作业的 Quartz 遗漏策略。

环境变量:QUARKUS_QUARTZ_SIMPLE_TRIGGER_MISFIRE_POLICY

显示更多

smart-policyignore-misfire-policyfire-nowsimple-trigger-reschedule-now-with-existing-repeat-countsimple-trigger-reschedule-now-with-remaining-repeat-countsimple-trigger-reschedule-next-with-remaining-countsimple-trigger-reschedule-next-with-existing-countcron-trigger-do-nothing

smart-policy

此作业的 Quartz 遗漏策略。

环境变量:QUARKUS_QUARTZ_CRON_TRIGGER_MISFIRE_POLICY

显示更多

smart-policyignore-misfire-policyfire-nowsimple-trigger-reschedule-now-with-existing-repeat-countsimple-trigger-reschedule-now-with-remaining-repeat-countsimple-trigger-reschedule-next-with-remaining-countsimple-trigger-reschedule-next-with-existing-countcron-trigger-do-nothing

smart-policy

应直接传递给 Quartz 的属性。在此处使用完整的配置属性键,例如 `quarkus.quartz.unsupported-properties."org.quartz.scheduler.jmx.export" = true)`。

此处设置的属性完全不受支持:由于 Quarkus 通常不了解这些属性及其用途,因此不能保证它们能正常工作,即使它们正常工作,在升级到更新版本的 Quarkus(即使只是微型/补丁版本)时也可能发生变化。

在回退到不受支持的属性之前,请考虑使用受支持的配置属性。如果没有,请务必提交功能请求,以便为 Quarkus 添加受支持的配置属性,更重要的是,可以定期测试该配置属性。

环境变量:QUARKUS_QUARTZ_UNSUPPORTED_PROPERTIES__FULL_PROPERTY_KEY_

显示更多

Map<String,String>

当设置为 true 时,阻塞的计划方法将在 Quartz 管理的线程上调用,而不是在常规 Quarkus 线程池(默认)的线程上调用。

启用此选项后,阻塞的计划方法不会在重复的上下文上运行。

环境变量:QUARKUS_QUARTZ_RUN_BLOCKING_SCHEDULED_METHOD_ON_QUARTZ_THREAD

显示更多

布尔值

false

每个作业的遗漏策略配置

类型

默认

此作业的 Quartz 遗漏策略。

环境变量:QUARKUS_QUARTZ_MISFIRE_POLICY__IDENTITY_

显示更多

smart-policyignore-misfire-policyfire-nowsimple-trigger-reschedule-now-with-existing-repeat-countsimple-trigger-reschedule-now-with-remaining-repeat-countsimple-trigger-reschedule-next-with-remaining-countsimple-trigger-reschedule-next-with-existing-countcron-trigger-do-nothing

smart-policy

实例 ID 生成器

类型

默认

配置的类名。

环境变量:QUARKUS_QUARTZ_INSTANCE_ID_GENERATORS__GENERATOR_NAME__CLASS

显示更多

字符串

必需

传递给类的属性。

环境变量:QUARKUS_QUARTZ_INSTANCE_ID_GENERATORS__GENERATOR_NAME__PROPERTIES__PROPERTY_KEY_

显示更多

Map<String,String>

触发器监听器

类型

默认

配置的类名。

环境变量:QUARKUS_QUARTZ_TRIGGER_LISTENERS__LISTENER_NAME__CLASS

显示更多

字符串

必需

传递给类的属性。

环境变量:QUARKUS_QUARTZ_TRIGGER_LISTENERS__LISTENER_NAME__PROPERTIES__PROPERTY_KEY_

显示更多

Map<String,String>

作业监听器

类型

默认

配置的类名。

环境变量:QUARKUS_QUARTZ_JOB_LISTENERS__LISTENER_NAME__CLASS

显示更多

字符串

必需

传递给类的属性。

环境变量:QUARKUS_QUARTZ_JOB_LISTENERS__LISTENER_NAME__PROPERTIES__PROPERTY_KEY_

显示更多

Map<String,String>

插件

类型

默认

配置的类名。

环境变量:QUARKUS_QUARTZ_PLUGINS__PLUGIN_NAME__CLASS

显示更多

字符串

必需

传递给类的属性。

环境变量:QUARKUS_QUARTZ_PLUGINS__PLUGIN_NAME__PROPERTIES__PROPERTY_KEY_

显示更多

Map<String,String>

关于 Duration 格式

要写入时长值,请使用标准的 java.time.Duration 格式。有关更多信息,请参阅 Duration#parse() Java API 文档

您还可以使用简化的格式,以数字开头

  • 如果该值仅为一个数字,则表示以秒为单位的时间。

  • 如果该值是一个数字后跟 ms,则表示以毫秒为单位的时间。

在其他情况下,简化格式将被转换为 java.time.Duration 格式以进行解析

  • 如果该值是一个数字后跟 hms,则在其前面加上 PT

  • 如果该值是一个数字后跟 d,则在其前面加上 P

相关内容