簡體   English   中英

從 Java 調用 clojure (Clojure Interop)

[英]calling clojure from Java (Clojure Interop)

從 Clojoure 調用 Java 非常簡單直接,但事實證明,反過來卻是不可預測的。

他們似乎有兩種方法:

1)以下課程

 i) import clojure.java.api.Clojure; , ii) import clojure.lang.IFn;

2)將你的clojure編譯成一個uberjar,然后將它導入到java代碼中。

我選擇了第二個選項,因為它更直接。

這是clojure代碼

(ns com.test.app.service
 (:gen-class
       :name com.test.app.service
       :main false
       :methods [^{:static true} [returned [int] int]]))

    (defn returned
      [number]
      (* 2 number))

    (defn -returned
      [number]
      (returned number))

這是Java代碼。

package com.s.profile;

import java.util.*;
import com.microsoft.azure.serverless.functions.annotation.*;
import com.microsoft.azure.serverless.functions.*;
import com.test.app.service;


/**
 * Azure Functions with HTTP Trigger.
 */
public class Function {
    /**
     * This function listens at endpoint "/api/hello". Two ways to invoke it using "curl" command in bash:
     * 1. curl -d "HTTP Body" {your host}/api/hello
     * 2. curl {your host}/api/hello?name=HTTP%20Query
     */
    @FunctionName("hello")
    public HttpResponseMessage<String> hello(
            @HttpTrigger(name = "req", methods = {"get", "post"}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        // Parse query parameter
        String query = request.getQueryParameters().get("name");
        String name = request.getBody().orElse(query);

        if (name == null) {
            return request.createResponse(400, "Please pass a name on the query string or in the request body");
        } else {
            service.returned(4);
            context.getLogger().info("process data" );
            return request.createResponse(200, "Hellos, " + name );
        }
    }
}

每當我制作“service.returned(4);” 系統永遠不會返回。 我不太明白為什么對我來說它會像函數沒有從 Clojure 返回一樣消失,但我看不到原因。

只是為了添加一些上下文,當它是一個簡單的 hello world java 應用程序時,我已經嘗試過它,它只是打印出結果並且它可以工作。 當我嘗試在 Azure 函數中實現它時。

請參閱此問題以獲取運行示例:

如何直接從 Java 調用 Clojure 函數

我建議首先簡化您的代碼,然后在 Azure 內容中一次添加一行,以防某些交互導致問題。

我遵循了這些說明,它似乎解決了找不到類的錯誤。 好像在運行命令時

mvn azure-functions:run

它不會自動找到所有導入的庫。 你要么必須使用

  1. Maven 程序集插件
  2. 行家陰影插件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM