Durable Functions を外部から呼ぶ方法
今日配信をしながら適当に試してみたのですが、Azure Functions の拡張機能の Durable Functions のオーケストレーター関数を外部から呼ぶことが出来たのでメモもしておきます。
呼び方
呼び出し方としては Microsoft.Azure.WebJobs.Extensions.DurableTask.ContextImplementations.IDurableClientFacotry
を使えるようにセットアップして IDurableClientFactory
から IDurableClient
を生成して StartNewAsync
とかでオーケストレーター関数を呼び出すような流れになります。
基本的には IServiceCollection
に対して AddDurableClientFactory
拡張メソッドを呼び出すことで必要なセットアップを行ってくれます。なので、基本的には ASP.NET Core の Web アプリケーションや汎用ホストを使ったコンソールアプリケーションなどから使うのが簡単です。
手順
では、コンソールアプリケーションから呼び出してみましょう。
コンソールアプリケーションのプロジェクトを作成したら、以下の NuGet パッケージを追加します。
- Microsoft.Extensions.Hosting
- Microsoft.Azure.WebJobs.Extensions.DurableTask
NuGet パッケージを追加したら、以下のように汎用ホストを作って IServiceCollection
に IDurableClientFactory
を使うための定義を追加します。
await Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddDurableClientFactory(); // これ!
services.AddHostedService<SampleService>();
})
.Build()
.RunAsync();
SampleService
クラスで、実際に IDurableClientFactory
を使って IDurableClient
を生成してオーケストレーター関数を呼び出します。
class SampleService : IHostedService
{
private readonly IDurableClientFactory _clientFactory;
public SampleService(IDurableClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
// CreateClient メソッドで IDurableClient を作成
var client = _clientFactory.CreateClient(new()
{
// Durable Functions が動いている Azure Functions が使っている接続文字列の名前
ConnectionName = "AzureWebJobsStorage",
// Durable Functions のタスクハブの名前
TaskHub = "TestHubName",
});
// あとはお好きなように
var instanceId = await client.StartNewAsync("Function1");
DurableOrchestrationStatus status;
do
{
status = await client.GetStatusAsync(instanceId);
await Task.Delay(1000);
}
while (status.RuntimeStatus != OrchestrationRuntimeStatus.Completed);
Console.WriteLine(status.Output);
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
CreateClient
の引数では、ストレージの接続文字列の設定の名前とタスクハブの名前を渡します。このストレージアカウントの接続文字列は IConfiguration
から取得する形になっています。そのため、プロジェクトに appsettings.json を追加して以下のようにストレージアカウントへの接続文字列を追加してあげる必要があります。
今回はローカルで動かしてる Azure Functions にあるオーケストレーター関数を呼ぶことを試したので、以下のようにストレージエミュレーターへの接続文字列を設定していました。
{
"AzureWebJobsStorage": "UseDevelopmentStorage=true"
}
これで、あとは呼び出し先の Azure Functions を起動した状態で、このコンソールアプリケーションを実行すると Function1 というオーケストレーター関数を呼び出して、完了まで待って結果を表示する動きをします。
まとめ
参考にしたのは、以下の Issue になります。
多分、サポートされてる使い方???ドキュメントにはないけど…。
Discussion