Scheduling Periodic Tasks
现代应用程序通常需要定期运行特定任务。在本指南中,您将学习如何计划定期任务。
如果您需要集群调度器,请使用 Quartz extension。 |
Solution
我们建议您遵循接下来的部分中的说明,按部就班地创建应用程序。然而,您可以直接跳到完成的示例。
克隆 Git 存储库: git clone {quickstarts-clone-url}
,或下载 {quickstarts-archive-url}[存档]。
该解决方案位于 scheduler-quickstart
directory中。
Creating the Maven project
首先,我们需要一个新项目。使用以下命令创建一个新项目:
Unresolved directive in scheduler.adoc - include::{includes}/devtools/create-app.adoc[]
它生成一个新项目,包括:
-
一个可通过
http://localhost:8080
访问的登陆页面 -
针对
native
和jvm
模式的Dockerfile
示例文件 -
the application configuration file
此项目还会导入 Quarkus REST(以前的 RESTEasy Reactive)和调度程序扩展。
如果您已配置 Quarkus 项目,则可以通过在项目基本目录中运行以下命令将 `scheduler`扩展添加到项目中:
Unresolved directive in scheduler.adoc - include::{includes}/devtools/extension-add.adoc[]
这会将以下内容添加到构建文件中:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-scheduler</artifactId>
</dependency>
implementation("io.quarkus:quarkus-scheduler")
Creating a scheduled job
在 `org.acme.scheduler`包中,创建 `CounterBean`类,内容如下:
package org.acme.scheduler;
import java.util.concurrent.atomic.AtomicInteger;
import jakarta.enterprise.context.ApplicationScoped;
import io.quarkus.scheduler.Scheduled;
import io.quarkus.scheduler.ScheduledExecution;
@ApplicationScoped (1)
public class CounterBean {
private AtomicInteger counter = new AtomicInteger();
public int get() { (2)
return counter.get();
}
@Scheduled(every="10s") (3)
void increment() {
counter.incrementAndGet(); (4)
}
@Scheduled(cron="0 15 10 * * ?") 5
void cronJob(ScheduledExecution execution) {
counter.incrementAndGet();
System.out.println(execution.getScheduledFireTime());
}
@Scheduled(cron = "{cron.expr}") 6
void cronJobWithExpressionInConfig() {
counter.incrementAndGet();
System.out.println("Cron expression configured in application.properties");
}
}
<1> 在 _application_作用域中声明 bean <1> `get()` 方法允许获取当前值。 <1> 使用 `@Scheduled`注释指示 Quarkus 每 10 秒运行此方法,前提是可使用工作程序线程(Quarkus 使用 10 个工作程序线程)。如果不可用,则应默认重新安排方法调用,即在可能的情况下调用它。计划方法的调用不依赖于先前调用的状态或结果。 <1> 代码非常简明。每 10 秒,计数器会递增。 <1> 使用类似 Cron 的表达式定义作业。带注释的方法每天上午 10:15 执行。 <1> 使用在 `application.properties` 中可配置的类似 cron 的表达式 `cron.expr` 定义一项作业。
Updating the application configuration file
编辑 application.properties
文件并添加 cron.expr
配置:
# By default, the syntax used for cron expressions is based on Quartz - https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html
# You can change the syntax using the following property:
# quarkus.scheduler.cron-type=unix
cron.expr=*/5 * * * * ?
Creating the REST resource
创建如下 CountResource
类:
package org.acme.scheduler;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
@Path("/count")
public class CountResource {
@Inject
CounterBean counter; (1)
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "count: " + counter.get(); (2)
}
}
<1> Inject the `CounterBean` <1> 发回当前计数器值
Package and run the application
使用以下内容运行应用程序:
Unresolved directive in scheduler.adoc - include::{includes}/devtools/dev.adoc[]
在另一个终端中,运行 curl localhost:8080/count
以检查计数器值。几秒钟后,重新运行 curl localhost:8080/count
以验证计数器已被增量。
观察控制台以验证消息 Cron expression configured in application.properties
已显示,表明使用在 application.properties
配置的表达式配置的 Cron 作业已触发。
和往常一样,可以使用以下命令打包应用程序:
Unresolved directive in scheduler.adoc - include::{includes}/devtools/build.adoc[]
并且使用 java -jar target/quarkus-app/quarkus-run.jar
执行。
你还可以按如下方式生成本机可执行文件:
Unresolved directive in scheduler.adoc - include::{includes}/devtools/build-native.adoc[]