簡體   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