Azure Functions でJavaを使う

というドキュメントがUpされていました。

ドキュメントはこちらです。

かいつまんで説明すると、Azure Functions上にはJavaの実行に必要なものが一通りあるのでBatch(.bat)などからjavaコマンドで.classまたは.jar指定して呼び出すだけ、となります。

サンプル

Azure Functions上でBatchで新規Functionを作ります。ここではQueueTrigger-Batchを使います。
image

作成された run.bat ファイルを例えば以下のように編集します。

echo OFF
SET /p inputMessage=<%inputMessage%

"D:\Program Files (x86)\Java\jdk1.8.0_73\bin\java" AzureFunction

SET /p のところはInput(Trigger)のQueueから中身のテキストを環境変数に放り込んでます(コード内であれこれするならなくてもいい)
肝心なのはjavaコマンドを呼び出してるところですね。 引数に渡している AzureFunction は実行するクラス名です。(これから作ります)

ではファイルを追加して AzureFunction.java を以下のようにします。

import java.io.*;

public class AzureFunction {
    public static void main(String[] args) {
        // inputMessage contains the content of the input queue item
        String input = System.getenv("inputMessage");
        System.out.println("Java app got message: " + input);

        try {
            // Env variable outputQueueItem has the path of the file to which output needs to be written
            PrintWriter writer = new PrintWriter(System.getenv("outputQueueItem"), "UTF-8");
            writer.println(input.toUpperCase());
            writer.close();
        } catch (IOException e) {
            // do something
        }
    }
}

クラス名はAzureFunctionです。(run.batで指定しているクラス名)
サンプルコードとしては環境変数に放り込んだInputのQueueを読みだして outputQueueItem で指定したQueueに大文字に変換した文字列を出力しています。なのでOutputのBindingも設定しておきましょう。
image
function.jsonの例

{
  "bindings": [
    {
      "name": "inputMessage",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "samples-batch",
      "connection": "function_STORAGE"
    },
    {
      "type": "queue",
      "name": "outputQueueItem",
      "queueName": "outqueue",
      "connection": "function_STORAGE",
      "direction": "out"
    }
  ],
  "disabled": false
}

さてJavaのソースだけだと実行できないのでコンパイルして.classファイルを生成しましょう。
「Function Appの設定」から「Kuduに移動」で表示されたKuduのDebug Console上で対象のFunctionのフォルダまで辿ります。(例:D:\home\site\wwwroot\JavaSmaple )

あとは以下のコマンドでコンパイルします。

"D:\Program Files (x86)\Java\jdk1.8.0_73\bin\javac" AzureFunction.java 

問題がなければAzureFunction.classが生成されると思います。
image

以上で準備は完了です。実際にinputQueueで指定したQueueにメッセージ放り込むとoutputQueueに結果のメッセージが放り込まれます。

image

ランタイムがどこに入っているかなど把握してBatchを使えばJava(ないし他の言語など)も動作させることができました。

またJarを使う場合は

"D:\Program Files (x86)\Java\jdk1.8.0_73\bin\java" -jar AzureFunction.jar

みたいに -jar でjarファイルを指定するだけです。
JavacもあるからKuduでコンパイルしなくても(run.bat内で処理することも)できなくはないですが、毎回コンパイルが走ることになるので不適切ですね。

まぁAzure Functions側でちゃんとサポートされればこんな手間は不要ですけど、今時点でJavaでやりたい!という方は参考にどうぞ。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中