>  기사  >  Java  >  실제 예제를 사용하여 Java에서 Clojure 호출(Clojure Quarkus)

실제 예제를 사용하여 Java에서 Clojure 호출(Clojure Quarkus)

Barbara Streisand
Barbara Streisand원래의
2024-10-02 06:31:01954검색

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

도전

지난 주말에 저는 Clojure가 기존 Java 생태계와 어떻게 상호 작용할 수 있는지 자세히 알아보기로 결정했습니다. 과제는 간단했습니다.

Quarkus 프레임워크를 기반으로 Clojure에서 간단한 웹 프레임워크를 만듭니다.

시설:

  • Quarkus는 경로가 몇 개 존재하는지조차 알 수 없으며 경로별로 무엇을 실행할지 알 수 없습니다.
  • Clojure를 사용하여 가능한 한 간단하게 경로와 핸들러를 생성할 수 있어야 합니다.
(defn send-hello-world [] "Hello World")

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

일부 정의:

  • Quarkus: Quarkus는 JVM(Java Virtual Machine) 및 네이티브 컴파일을 위해 만들어진 풀 스택 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 폴더와 동일한 위치에 경로를 선언하기 위한 하나의 구조를 정의했습니다. 그런 다음 아래 코드를 사용하여 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를 사용하여 동적 경로를 생성하는 방법을 보여주는 간단한 예입니다. 몇 단계만으로 우리는 두 생태계를 연결하고 기본 라우팅 시스템을 설정했습니다. 자유롭게 이 기반을 확장하고 Clojure 및 Quarkus를 통해 다른 가능성을 탐색해 보세요!

위 내용은 실제 예제를 사용하여 Java에서 Clojure 호출(Clojure Quarkus)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.