繁体   English   中英

使用 GraalVM 编译本机图像的 Java 调度程序

[英]Java scheduler that works with native image compilation by GraalVM

我有 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 中调度任务的替代工具,可与本机图像编译一起使用?

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

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

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

也许偏离主题,但只是为了让您知道在 (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 美分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM