🐷

Durable Functions を外部から呼ぶ方法

2022/02/06に公開

今日配信をしながら適当に試してみたのですが、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 パッケージを追加したら、以下のように汎用ホストを作って IServiceCollectionIDurableClientFactory を使うための定義を追加します。

Program.cs
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 にあるオーケストレーター関数を呼ぶことを試したので、以下のようにストレージエミュレーターへの接続文字列を設定していました。

appsettings.json
{
  "AzureWebJobsStorage": "UseDevelopmentStorage=true"
}

これで、あとは呼び出し先の Azure Functions を起動した状態で、このコンソールアプリケーションを実行すると Function1 というオーケストレーター関数を呼び出して、完了まで待って結果を表示する動きをします。

まとめ

参考にしたのは、以下の Issue になります。

https://github.com/Azure/azure-functions-durable-extension/issues/1600

多分、サポートされてる使い方???ドキュメントにはないけど…。

Microsoft (有志)

Discussion