はじめに
最近、Azure Functionsのお勉強をチマチマと始めました。色々と分からないことが多かったのでお勉強メモをまとめて記します。
どこまで続くかわからないお勉強メモ。今日は3回目です。今回もJavaですが、今回はTimer Triggerの実装です。過去のものは以下を参照。
- Azure Functionsのお勉強メモ(1)TypeScriptでチュートリアルを実施する - miyohide's blog
- Azure Functionsのお勉強メモ(2)Spring Cloud FunctionでHTTP Triggerを実装する - miyohide's blog
Timer Triggerを試す
HTTP Triggerが実装できたので、次は定期的にジョブを実行するTimer Triggerを実装してみます。
APIを確認する
HTTP Triggerの場合は、@HttpTrigger
アノテーションを使って色々と書きましたが、 Timer Triggerの場合はどのように書くかを調べます。
Azure Functions Java Libraryのマニュアルに書かれていました。
今回はTimer Triggerですが、他のTriggerもAzure Functions Java Libraryの以下のページを見ると良いかと思います。
NCRON
Timer Triggerの発生頻度を指定するにはNCronの書式で指定する必要があるのですが、毎回どうやって指定すればいいか忘れます。何か便利なツールないかなと探していたら、以下のオンラインツールを見つけました。
https://ncrontab.swimburger.net/
Web上でNCronの書式を入力したらいつジョブが実行されるかがすぐ計算してくれるツールです。
ローカル設定ファイルの編集
Timer Triggerにおいては、実行するジョブの管理などのためにAzure Storageを利用する必要があります(参考)。ローカル環境においてはシミュレーターを使うことができます。
具体的な設定は、local.settings.json
ファイルにおいて、"AzureWebJobsStorage"
の値を"UseDevelopmentStorage=true"
を指定すればOKです。
詳細は、以下のドキュメントを参照してください。
Azure Storageのシミュレーター
Azure Storageのシミュレーターとして、2021年3月時点ではAzuriteというものを使うようです。
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)
ソース
この時点のソースです。