0

我的应用程序位于 Quarkus 框架之上。该应用程序的主要功能 - 用于安排一些任务的简单 REST API(现在它只是将一些消息发布到日志中)。

我使用 Quartz 框架实现的调度功能,通常看起来当应用程序收到 POST 请求以调度新事件时,它会做两件事:

  • 将请求中的实体保存到数据库;
  • 安排在 JSON 日期和时间中提到的 Quartz 作业。

同样对于应用程序刚刚启动的情况,我创建了从数据库中获取所有实体并为它们安排 Quartz 作业的方法。

但是当我尝试使用 GraalVM 为该应用程序构建本机映像时,我遇到了这样的异常:

com.oracle.graal.pointsto.constraints.UnsupportedFeatureException:图像堆中不允许有 sun.security.provider.NativePRNG 的实例,因为此类应在图像运行时初始化。

Google 中的快速搜索在GraalVM Github 存储库中给了我关闭的问题,即 Quartz 使用 RMI 的 ObjID 和运行时初始化。由于 Quartz 不能用于需要 GraalVM 进行本机映像编译的应用程序。

那么 Quarkus 调度器是否提供了在 Java 代码中调度作业的能力(类似于我使用 Quartz 的实现)?在我发现的所有示例和代码片段中,我只能看到在方法上使用 @Scheduled 注释的非常简单的用法(就像在官方指南中一样)。或者,也许有任何其他替代工具可以在 Java 中与本机图像编译一起使用来调度任务?

4

2 回答 2

1

也许题外话,但只是为了让您知道在(Docker)容器中运行您的应用程序时可能会遇到奇怪的调度问题,因为容器中的时区可能与您的本地时区不同。因此,调度程序可能会在与您配置的完全不同的时间进行灭火。

为了解决这个问题,我必须在我的 Dockerfile 中添加以下几行:

# set the correct timezone
RUN apk add --no-cache tzdata
ENV TZ=Europe/Amsterdam  <---your timezone
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

只是我的2美分。

于 2020-02-18T12:33:42.917 回答
1

所以 Quarkus Quartz 扩展(建立在 之上quarkus-scheduler)确实支持 GraalVM 原生镜像。事实上,API 不支持编程调度,并且无法访问底层的 QuartzScheduler实例。我创建了https://github.com/quarkusio/quarkus/issues/7246来解决后一个问题。

Quarkus 调度程序也提供了在 Java 代码中调度作业的能力......

是的,请参阅https://stackoverflow.com/a/60275796/2654154

于 2020-02-18T07:31:05.823 回答