我在Quarkus框架之上拥有该应用程序。该应用程序的主要功能-用于计划一些任务的简单REST API(现在它只是将一些消息发布到日志中)。
我用Quartz框架实现的调度功能,并且通常看起来像当应用程序收到POST请求以调度新事件时,它执行两件事:
同样,对于应用程序刚启动时的情况,我创建了一种方法,该方法从数据库中获取所有实体并为它们安排Quartz作业。
但是,当我尝试使用GraalVM为该应用程序构建本机映像时,我遇到了这样的异常:
com.oracle.graal.pointsto.constraints.UnsupportedFeatureException:否 图像中允许使用sun.security.provider.NativePRNG的实例 堆,因为此类应在图像运行时初始化。
Google的快速搜索给了我closed issue in GraalVM Github repo,这说明Quartz使用RMI的ObjID进行运行时初始化。因此,Quartz不能用于需要GraalVM进行本机图像编译的应用程序中。
那么Quarkus Scheduler是否提供了使用Java代码(类似于我在Quartz中的实现方式)来调度作业的功能?在所有示例和代码段中,我发现我只能看到方法中@Scheduled注释的非常简单的用法(如官方指南中所述)。也许还有其他替代工具可用于在Java中安排与本机图像编译一起使用的任务?
答案 0 :(得分:1)
因此Quarkus Quartz扩展(建立在quarkus-scheduler
之上)确实支持GraalVM本机映像。事实是,该API不支持编程调度,并且无法访问基础的Quartz Scheduler
实例。我创建了https://github.com/quarkusio/quarkus/issues/7246来解决后一个问题。
Quarkus调度程序也提供了使用Java代码直接调度作业的功能...
答案 1 :(得分: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美分。