[英]Java scheduler that works with native image compilation by GraalVM
我有 Quarkus 框架之上的應用程序。 該應用程序的主要功能 - 用於安排一些任務的簡單 REST API(現在它只是向日志發布一些消息)。
我使用 Quartz 框架實現的調度功能,通常看起來當應用程序收到用於調度新事件的 POST 請求時,它會做兩件事:
同樣對於應用程序剛啟動時的情況,我創建了從數據庫中獲取所有實體並為它們安排 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 代碼中調度作業的能力......
也許偏離主題,但只是為了讓您知道在 (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.