というドキュメントが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でやりたい!という方は参考にどうぞ。