Azure Functionsのお勉強メモ(3)Spring Cloud FunctionでTimer Triggerを実装する

はじめに

最近、Azure Functionsのお勉強をチマチマと始めました。色々と分からないことが多かったのでお勉強メモをまとめて記します。

どこまで続くかわからないお勉強メモ。今日は3回目です。今回もJavaですが、今回はTimer Triggerの実装です。過去のものは以下を参照。

Timer Triggerを試す

HTTP Triggerが実装できたので、次は定期的にジョブを実行するTimer Triggerを実装してみます。

APIを確認する

HTTP Triggerの場合は、@HttpTriggerアノテーションを使って色々と書きましたが、 Timer Triggerの場合はどのように書くかを調べます。

Azure Functions Java Libraryのマニュアルに書かれていました。

docs.microsoft.com

今回はTimer Triggerですが、他のTriggerもAzure Functions Java Libraryの以下のページを見ると良いかと思います。

docs.microsoft.com

NCRON

Timer Triggerの発生頻度を指定するにはNCronの書式で指定する必要があるのですが、毎回どうやって指定すればいいか忘れます。何か便利なツールないかなと探していたら、以下のオンラインツールを見つけました。

https://ncrontab.swimburger.net/

Web上でNCronの書式を入力したらいつジョブが実行されるかがすぐ計算してくれるツールです。

ローカル設定ファイルの編集

Timer Triggerにおいては、実行するジョブの管理などのためにAzure Storageを利用する必要があります(参考)。ローカル環境においてはシミュレーターを使うことができます。 具体的な設定は、local.settings.jsonファイルにおいて、"AzureWebJobsStorage"の値を"UseDevelopmentStorage=true"を指定すればOKです。 詳細は、以下のドキュメントを参照してください。

docs.microsoft.com

Azure Storageのシミュレーター

Azure Storageのシミュレーターとして、2021年3月時点ではAzuriteというものを使うようです。

docs.microsoft.com

Node.jsやDockerを使ってインストールできます。私はDockerを使って環境を準備しました。

実装

良い実装例が思いつかなかったので、単にログを出力しています。HTTP Triggerと同じようにHandlerをつくり、handleRequestにて処理の実態を呼び出します。まずはHandler。

public class TimerTriggerHandler extends FunctionInvoker<String, String> {
    @FunctionName("minutesBatch")
    public void minutesBatch(
            @TimerTrigger(name = "minutesBatch", schedule = "0 * * * * *") String timerInfo,
            ExecutionContext context
    ) {
        context.getLogger().info("Java Timer trigger process start.");
        handleRequest("minutesBatch start", context);
        context.getLogger().info("Java Timer trigger process end.");
    }
}

次に処理の実態。

@Component("minutesBatch")
public class MinutesBatchFunction implements Function<Message<String>, String> {
    @Override
    public String apply(Message<String> m) {
        ExecutionContext context = m.getHeaders().get("executionContext", ExecutionContext.class);
        context.getLogger().info("start minutes batch");
        context.getLogger().info("end minutes batch");
        return "SUCCESS";
    }
}

実行

Azuriteを起動したあとにgradlew azureFunctionsRunでアプリを実行すると、毎分以下のようなログが出力されます。

[2021-03-28T12:03:00.818Z] Java Timer trigger process start.
[2021-03-28T12:03:00.825Z] start minutes batch
[2021-03-28T12:03:00.825Z] end minutes batch
[2021-03-28T12:03:00.825Z] Java Timer trigger process end.
[2021-03-28T12:03:00.826Z] Function "minutesBatch" (Id: e000b1f6-7c95-4f59-a973-987cba50ad74) invoked by Java Worker
[2021-03-28T12:03:00.845Z] Executed 'Functions.minutesBatch' (Succeeded, Id=e000b1f6-7c95-4f59-a973-987cba50ad74, Duration=818ms)

ソース

この時点のソースです。

github.com