Özel düzenleme durumunu ayarlama ve sorgulama

Özel düzenleme durumu, dış istemcilerin istediği zaman sorgu edebilmesi için çalışan bir düzenleme örneğine rastgele JSON meta verileri eklemenize olanak tanır. Aşağıdaki durumlarda özel durum kullanın:

  • Raporun ilerleme durumunu uçuş ortasında bildirme — bir kullanıcı arabiriminin bir düzenlemenin tamamlanmasını beklemeden hangi adıma ulaştığını göstermesine izin verin.
  • Arayanlara dinamik verileri döndürün — koordine proses çalışmaya devam ederken, önerileri, indirim bilgilerini veya sonraki adım yönergelerini sunun.
  • Dış sistemlerle eşgüdüm sağlayın; diğer hizmetlerin veya insan operatörlerin yoklayıp işlem yapabilecekleri durumu paylaşın.

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 dış depolamayı kullanın ve bunun yerine özel durumda bir başvuru (blob URL'si gibi) depolayın.

Azure İşlevleri'da bu durum, düzenleme istemci nesnesindeki HTTP GetStatus API veya eşdeğer SDK API aracılığıyla kullanılabilir.

Dayanıklı Görev SDK'larında bu durum, DurableTaskClient'daki düzenleme durumu sorgu API'leri aracılığıyla kullanılabilir (örneğin, .NET'de GetInstanceAsync veya Java'da getInstanceMetadata).

Önemli

Şu anda PowerShell Dayanıklı Görev SDK'sı kullanılamıyor.

Özel orkestrasyon durumu için örnek kullanım senaryoları

Aşağıdaki tabloda yaygın desenler özetlemektedir. İlgili örne atlamak için bir kullanım örneği seçin.

Kullanım örneği Açıklama
Düzenleme ilerleme durumunu görselleştirme İstemcilerin ilerleme göstergesi görüntüleyebilmesi için her etkinlik sonrasında bir dizeyi veya nesneyi güncelleştirin.
İstemcilere dinamik meta veriler döndürme İstemcilerin özel sunucu tarafı uç noktalarına gerek kalmadan işleyebilecekleri yapılandırılmış verileri (öneriler gibi) ayarlayın.
İstemcilere eyleme dönüştürülebilir veriler sağlama Orkestrasyon bir dış olayı beklerken, istemcilerin işlem yapacağı rezervasyon URL'lerini, indirim bilgilerini veya sonraki adım yönergelerini sunar.
Özel durumu sorgulama HTTP API'lerini veya SDK çağrılarını kullanarak istemciden gelen özel durum değerini okuyun.

Orkestrasyon sürecini görselleştirmek

Bu düzende, düzenleyici her etkinlik tamamlandıktan sonra SetCustomStatus (veya dilinizdeki eşdeğerini) çağırır ve son tamamlanan şehrin adıyla durumu günceller. İstemci durum uç noktasını yoklar, geçerli değeri okur ve kullanıcı arabirimindeki bir ilerleme göstergesini güncelleştirir.

Aşağıdaki örnek, Dayanıklı İşlevler HTTP durum uç noktasını kullanarak ilerleme paylaşımını gösterir:

Uyarı

Bu örnekler 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}!";
}

Aşağıdaki örnek, Dayanıklı Görev SDK'sı istemci API'lerini kullanarak ilerleme paylaşımını gösterir:

using System.Threading.Tasks;
using Microsoft.DurableTask;

public class HelloCities : TaskOrchestrator<object?, string>
{
    public override async Task<string> RunAsync(TaskOrchestrationContext context, object? input)
    {
        string result = "";

        result += await context.CallActivityAsync<string>("SayHello", "Tokyo") + ", ";
        context.SetCustomStatus("Tokyo");

        result += await context.CallActivityAsync<string>("SayHello", "London") + ", ";
        context.SetCustomStatus("London");

        result += await context.CallActivityAsync<string>("SayHello", "Seattle");
        context.SetCustomStatus("Seattle");

        return result;
    }
}

İstemci düzenleme orkestrasyon meta verilerini yoklayabilir ve alan CustomStatus olarak ayarlanana kadar bekleyebilir.

using System.Threading.Tasks;
using Microsoft.DurableTask.Client;

string instanceId = await client.ScheduleNewOrchestrationInstanceAsync("HelloCities");

OrchestrationMetadata metadata = await client.WaitForInstanceStartAsync(instanceId, getInputsAndOutputs: true);
while (metadata.SerializedCustomStatus is null || metadata.ReadCustomStatusAs<string>() != "London")
{
    await Task.Delay(200);
    metadata = await client.GetInstanceAsync(instanceId, getInputsAndOutputs: true) ?? metadata;
}

Aşağıdaki istemci kodu orkestrasyon durumunu yoklar ve yanıt döndürmeden önce CustomStatus ayarlandığında "London" bekler.

[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;
  }
}

İstemcilere dinamik meta veriler döndürme

Kişiselleştirilmiş öneriler gibi yapılandırılmış verileri ayrı uç noktalar oluşturmadan istemcilere döndürmek için özel düzenleme durumunu kullanabilirsiniz. Düzenleyici girişe göre özel durumu ayarlar ve istemci bunu standart durum API'si aracılığıyla okur. Bu, tüm mantık sunucu tarafında kalırken, istemci tarafı kodunun esnek kalmasını sağlar.

[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
}
using System.Threading.Tasks;
using Microsoft.DurableTask;

public class CityRecommender : TaskOrchestrator<int, object?>
{
    public override Task<object?> RunAsync(TaskOrchestrationContext context, int userChoice)
    {
        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
        return Task.FromResult<object?>(null);
    }
}

İstemcilere eyleme dönüştürülebilir veriler sağlama

Bu düzende düzenleyici özel durum aracılığıyla indirim, rezervasyon URL'si ve zaman aşımı gibi zamana duyarlı bilgileri ortaya çıkar ve ardından bir dış olayı beklemek için duraklatılır. İstemci, teklifi görüntülemek için özel durumu okur ve kullanıcı harekete geçtiğinde onay olayını düzenleyiciye geri gönderir.

[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;
}
using System.Threading.Tasks;
using Microsoft.DurableTask;

public class ReserveTicket : TaskOrchestrator<string, bool>
{
    public override async Task<bool> RunAsync(TaskOrchestrationContext context, string userId)
    {
        int discount = await context.CallActivityAsync<int>("CalculateDiscount", userId);

        context.SetCustomStatus(new
        {
            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;
    }
}

Özel düzenleme durumunu sorgulama

Önceki örneklerde orchestrator kodundan özel durumun nasıl ayarlanacağı gösterilmektedir. Bu bölüm, dış istemcilerin bu değeri nasıl okuduğuna odaklanır.

Bir düzenleyici SetCustomStatus çağırdıktan sonra, dış istemciler yerleşik Dayanıklı İşlevler HTTP API'sini kullanarak değeri sorgulayabilir. Örneğin:

GET /runtime/webhooks/durabletask/instances/instance123

Yanıt, customStatus alanıyla birlikte çalışma zamanı meta verilerini içerir.

{
  "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"
}

Ayrıca, düzenleme istemci SDK'sını kullanarak program aracılığıyla özel durumu sorgulayabilirsiniz. Tam başvuru için bkz. Sorgu örnekleri.

Dayanıklı Görev SDK'ları yerleşik bir HTTP durum uç noktası sağlamaz. Bunun yerine, DurableTaskClient üzerinde orkestrasyon örneği meta veri API'lerini kullanarak program aracılığıyla özel durumu sorgulayın.

using Microsoft.DurableTask.Client;

OrchestrationMetadata? metadata = await client.GetInstanceAsync(instanceId, getInputsAndOutputs: true);
string? customStatusJson = metadata?.SerializedCustomStatus;

Uyarı

Özel durum yükü 16 KB UTF-16 JSON metniyle sınırlıdır.

Sonraki Adımlar