Maison  >  Article  >  Java  >  Appeler Clojure depuis Java en utilisant un exemple réel (Clojure Quarkus)

Appeler Clojure depuis Java en utilisant un exemple réel (Clojure Quarkus)

Barbara Streisand
Barbara Streisandoriginal
2024-10-02 06:31:01954parcourir

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

Le défi

Le week-end dernier, j'ai décidé d'explorer davantage la manière dont Clojure peut interagir avec l'écosystème Java existant, le défi était simple :

Créez un framework Web simple dans Clojure en utilisant le framework Quarkus comme base.

Locaux :

  • Le Quarkus ne sait pas ce qui sera exécuté par route, ni même combien de routes existent.
  • Je devrais pouvoir créer des itinéraires et des gestionnaires en utilisant Clojure aussi simplement que possible :
(defn send-hello-world [] "Hello World")

(defn routes [] [{:method "GET"
                  :path "/hello" 
                  :handler send-hello-world}])

Quelques définitions :

  • Quarkus : Quarkus est un framework Java full-stack natif de Kubernetes conçu pour les machines virtuelles Java (JVM) et la compilation native, optimisant Java spécifiquement pour les conteneurs.
  • Clojure : est un langage de programmation dynamique à usage général

Étape 1 : Créer une application Quarkus

Il est très facile de démarrer une application dans Quarkus, vous pouvez suivre ce tutoriel, car vous pouvez voir que votre dernière commande sera quarkus create && cd code-with-quarkus après cela, vous pourrez ouvrir le dossier code-with-quarkus avec votre IDE préféré, la commande a créé la structure de base d'une application Quarkus, et vous pouvez l'exécuter avec quarkus dev

Étape 2 : Activer le projet pour reconnaître les fichiers clj

Vous devez configurer Quarkus pour inclure les fichiers .clj dans le dossier cible (le dossier contenant votre application compilée), et vous pouvez le faire en ajoutant cette configuration dans pom.xml dans

<resources>
        <resource>
            <directory>/</directory>
            <includes>
                <include>*.clj</include>
            </includes>
        </resource>
    </resources>

Étape 3 : Créer un fichier Clojure

Comme je l'ai mentionné plus tôt, j'ai défini une structure pour déclarer mes routes, au même emplacement du dossier main. Ensuite j'ai créé un dossier nommé quarkus_clj avec un fichier appelé core avec le code ci-dessous :

(ns quarkus-clj.core)

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

(defn routes [] [{:method "GET"
                  :path "/hello" 
                  :handler send-hello-world}])

Étape 4 : Activer Quarkus pour gérer mon programme Clojure

C'est ici que la magie opère ??!

Tout d'abord, vous devez installer Clojure dans votre application Quarkus ; vous pouvez le faire en ajoutant une dépendance dans pom.xml

<dependency>
      <groupId>org.clojure</groupId>
        <artifactId>clojure</artifactId>
        <version>1.11.1</version> 
</dependency>

Maintenant, vous pouvez supprimer le fichier GreetingResource.java et ses tests. Au même endroit, créez un fichier Starting.java

J'écris quelques commentaires expliquant comment ça marche

@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);
        }
    }
}

Maintenant, vous pouvez simplement exécuter : quarkus dev ouvre votre route déclarée et voyez le résultat !

Conclusion

C'était un exemple rapide de la façon d'utiliser Clojure dans une application Quarkus pour créer des itinéraires dynamiques. En quelques étapes seulement, nous avons connecté les deux écosystèmes et mis en place un système de routage de base. N'hésitez pas à développer cette base et à explorer d'autres possibilités avec Clojure et Quarkus !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn