Aracılığıyla paylaş


Dayanıklı İşlevler'de özel düzenleme durumu (Azure İşlevleri)

Özel düzenleme durumu, orchestrator işleviniz için özel bir durum değeri ayarlamanıza olanak tanır. Bu durum, düzenleme istemci nesnesinde HTTP GetStatus API'sini veya eşdeğer SDK API'sini kullanarak sağlanır.

Kullanım örnekleri

İlerleme durumunu görselleştirme

İstemciler durum bitiş noktasını yoklayabilir ve geçerli yürütme aşamasını görselleştiren bir ilerleme kullanıcı arabirimi görüntüleyebilir. Aşağıdaki örnekte ilerleme paylaşımı gösterilmektedir:

Not

Bu C# örnekleri Dayanıklı İşlevler 2.x için yazılmıştır ve Dayanıklı İşlevler 1.x ile uyumlu değildir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

[FunctionName("E1_HelloSequence")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Tokyo"));
    context.SetCustomStatus("Tokyo");
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Seattle"));
    context.SetCustomStatus("Seattle");
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "London"));
    context.SetCustomStatus("London");

    // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
    return outputs;
}

[FunctionName("E1_SayHello")]
public static string SayHello([ActivityTrigger] string name)
{
    return $"Hello {name}!";
}

Ardından istemci yalnızca alan "Londra" olarak ayarlandığında düzenlemenin CustomStatus çıkışını alır:

[FunctionName("HttpStart")]
public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient starter,
    string functionName,
    ILogger log)
{
    // Function input comes from the request content.
    dynamic eventData = await req.Content.ReadAsAsync<object>();
    string instanceId = await starter.StartNewAsync(functionName, (string)eventData);

    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

    DurableOrchestrationStatus durableOrchestrationStatus = await starter.GetStatusAsync(instanceId);
    while (durableOrchestrationStatus.CustomStatus.ToString() != "London")
    {
        await Task.Delay(200);
        durableOrchestrationStatus = await starter.GetStatusAsync(instanceId);
    }

    HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new StringContent(JsonConvert.SerializeObject(durableOrchestrationStatus))
    };

    return httpResponseMessage;
  }
}

Çıktı özelleştirme

Bir diğer ilginç senaryo da benzersiz özelliklere veya etkileşimlere göre özelleştirilmiş çıkış döndürerek kullanıcıları segmentlere ayırmaktır. Özel düzenleme durumu yardımıyla istemci tarafı kodu genel kalır. Tüm ana değişiklikler, aşağıdaki örnekte gösterildiği gibi sunucu tarafında gerçekleşir:

[FunctionName("CityRecommender")]
public static void Run(
  [OrchestrationTrigger] IDurableOrchestrationContext context)
{
  int userChoice = context.GetInput<int>();

  switch (userChoice)
  {
    case 1:
    context.SetCustomStatus(new
    {
      recommendedCities = new[] {"Tokyo", "Seattle"},
      recommendedSeasons = new[] {"Spring", "Summer"}
     });
      break;
    case 2:
      context.SetCustomStatus(new
      {
        recommendedCities = new[] {"Seattle, London"},
        recommendedSeasons = new[] {"Summer"}
      });
        break;
      case 3:
      context.SetCustomStatus(new
      {
        recommendedCities = new[] {"Tokyo, London"},
        recommendedSeasons = new[] {"Spring", "Summer"}
      });
        break;
  }

  // Wait for user selection and refine the recommendation
}

Yönerge belirtimi

Düzenleyici, özel durum aracılığıyla istemcilere benzersiz yönergeler sağlayabilir. Özel durum yönergeleri düzenleme kodundaki adımlarla eşlenir:

[FunctionName("ReserveTicket")]
public static async Task<bool> Run(
  [OrchestrationTrigger] IDurableOrchestrationContext context)
{
  string userId = context.GetInput<string>();

  int discount = await context.CallActivityAsync<int>("CalculateDiscount", userId);

  context.SetCustomStatus(new
  {
    discount = discount,
    discountTimeout = 60,
    bookingUrl = "https://www.myawesomebookingweb.com",
  });

  bool isBookingConfirmed = await context.WaitForExternalEvent<bool>("BookingConfirmed");

  context.SetCustomStatus(isBookingConfirmed
    ? new {message = "Thank you for confirming your booking."}
    : new {message = "The booking was not confirmed on time. Please try again."});

  return isBookingConfirmed;
}

HTTP ile özel durumu sorgulama

Aşağıdaki örnekte, yerleşik HTTP API'leri kullanılarak özel durum değerlerinin nasıl sorgulanabileceği gösterilmektedir.

public static async Task SetStatusTest([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    // ...do work...

    // update the status of the orchestration with some arbitrary data
    var customStatus = new { nextActions = new [] {"A", "B", "C"}, foo = 2, };
    context.SetCustomStatus(customStatus);

    // ...do more work...
}

Düzenleme çalışırken dış istemciler şu özel durumu getirebilir:

GET /runtime/webhooks/durabletask/instances/instance123

İstemciler aşağıdaki yanıtı alır:

{
  "runtimeStatus": "Running",
  "input": null,
  "customStatus": { "nextActions": ["A", "B", "C"], "foo": 2 },
  "output": null,
  "createdTime": "2019-10-06T18:30:24Z",
  "lastUpdatedTime": "2019-10-06T19:40:30Z"
}

Uyarı

Özel durum yükü 16 KB UTF-16 JSON metniyle sınırlıdır. Daha büyük bir yüke ihtiyacınız varsa harici depolama kullanmanızı öneririz.

Sonraki adımlar