実際の例を使用して Java から Clojure を呼び出す (Clojure Quarkus)

Barbara Streisand
リリース: 2024-10-02 06:31:01
オリジナル
958 人が閲覧しました

Calling Clojure from Java using a real example (Clojure   Quarkus)

挑戦

先週末、私は Clojure が既存の Java エコシステムとどのように対話できるかをさらに調査することにしました。その課題は単純でした。

Quarkus フレームワークをベースとして使用して、Clojure で単純な Web フレームワークを作成します。

敷地:

  • Quarkus は、ルートがいくつ存在するかさえも、ルートごとに何が実行されるのかを知りません。
  • Clojure を使用してルートとハンドラーをできるだけ簡単に作成できるはずです。
(defn send-hello-world [] "Hello World")

(defn routes [] [{:method "GET"
                  :path "/hello" 
                  :handler send-hello-world}])
ログイン後にコピー

いくつかの定義:

  • Quarkus: Quarkus は、Java 仮想マシン (JVM) およびネイティブ コンパイル用に作成されたフルスタックの Kubernetes ネイティブ Java フレームワークであり、特にコンテナー向けに Java を最適化します。
  • Clojure: 動的な汎用プログラミング言語

ステップ 1: Quarkus アプリの作成

Quarkus でアプリを起動するのは非常に簡単です。このチュートリアルに従ってください。最後のコマンドが quarkus create && cd code-with-quarkus であることがわかります。その後、次のコマンドで code-with-quarkus フォルダーを開くことができます。お気に入りの IDE で、コマンドによって Quarkus アプリの基本構造が作成され、quarkus dev

で実行できます。

ステップ 2: プロジェクトが clj ファイルを認識できるようにする

ターゲット フォルダー (コンパイルされたアプリが含まれるフォルダー) に .clj ファイルを含めるように Quarkus を設定する必要があります。これを行うには、
内の pom.xml にこの設定を追加します。

<resources>
        <resource>
            <directory>/</directory>
            <includes>
                <include>*.clj</include>
            </includes>
        </resource>
    </resources>
ログイン後にコピー

ステップ 3: Clojure ファイルを作成する

前に述べたように、フォルダー main の同じ場所に、ルートを宣言するための 1 つの構造体を定義しました。次に、以下のコードを含む core というファイルを含む quarkus_clj という名前のフォルダーを作成しました。

(ns quarkus-clj.core)

(defn send-hello-world [] "Hello World")

(defn routes [] [{:method "GET"
                  :path "/hello" 
                  :handler send-hello-world}])
ログイン後にコピー

ステップ 4: Quarkus が Clojure プログラムを処理できるようにする

ここで魔法が起こる??!

まず、Quarkus アプリ内に Clojure をインストールする必要があります。これを行うには、pom.xml
に依存関係を追加します。

<dependency>
      <groupId>org.clojure</groupId>
        <artifactId>clojure</artifactId>
        <version>1.11.1</version> 
</dependency>
ログイン後にコピー

これで、ファイル GreetingResource.java とそのテストを削除できます。同じ場所に、Starting.java

ファイルを作成します。

どのように機能するかを説明するコメントをいくつか書きます

@ApplicationScoped
public class Starting {
    //Setup app routes
    public void setupRouter(@Observes Router router) {
        // Load Clojure core;
        IFn require = Clojure.var("clojure.core", "require");
        // Load quarkus-clj.core namespace
        require.invoke(Clojure.read("quarkus-clj.core")); 

        // Load the route list function
        IFn routesFn = Clojure.var("quarkus-clj.core", "route");

        // Invoke the function with no parameters
        PersistentVector routesVector = (PersistentVector) routesFn.invoke();

        //For each route in routes vector 
        for (Object route : routesVector) {
            /**Get the route map, example
            {:method "GET"
             :path "/hello" 
             :handler send-hello-world}
             */
            PersistentArrayMap routeMap = (PersistentArrayMap) route;

            //Get :path value
            String path = (String) routeMap.valAt(Clojure.read(":path"));
            //Get :handler function
            IFn handlerRoute = (IFn) routeMap.valAt(Clojure.read(":handler"));
            //Get :method value
            String method = (String) routeMap.valAt(Clojure.read(":method"));
            //Create a handler to exec handler function
            Handler<RoutingContext> handlerFn = (RoutingContext context) -> {
            String result = (String) handlerRoute.invoke();  
            context.response().end(result);
        };
            //Config the route in quarkus
            router.route(HttpMethod.valueOf(method), path).handler(handlerFn);
        }
    }
}
ログイン後にコピー

これで、「quarkus dev」を実行するだけで、宣言されたルートを開いて結果を確認できます。

結論

これは、Quarkus アプリ内で Clojure を使用して動的ルートを作成する方法の簡単な例でした。わずか数ステップで 2 つのエコシステムを接続し、基本的なルーティング システムをセットアップしました。自由にこの基盤を拡張し、Clojure と Quarkus を使用して他の可能性を探索してください!

以上が実際の例を使用して Java から Clojure を呼び出す (Clojure Quarkus)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!