というドキュメントがUpされていました。
ドキュメントはこちらです。
かいつまんで説明すると、Azure Functions上にはJavaの実行に必要なものが一通りあるのでBatch(.bat)などからjavaコマンドで.classまたは.jar指定して呼び出すだけ、となります。
サンプル
Azure Functions上でBatchで新規Functionを作ります。ここではQueueTrigger-Batchを使います。![]()
作成された 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も設定しておきましょう。![]()
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が生成されると思います。![]()
以上で準備は完了です。実際にinputQueueで指定したQueueにメッセージ放り込むとoutputQueueに結果のメッセージが放り込まれます。
ランタイムがどこに入っているかなど把握して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でやりたい!という方は参考にどうぞ。