Hızlı Başlangıç: Java Dayanıklı İşlevler uygulaması oluşturma

Java durum bilgisi olan sunucusuz iş akışları yazmak için Azure İşlevleri özelliği olan Dayanıklı İşlevler kullanın. Bu hızlı başlangıçta, iki yaygın düzenleme desenini gösteren bir örnek uygulamayı kopyalayıp çalıştıracaksınız:

  • İşlev zinciri: Etkinlikleri sırayla çağırır (Tokyo → Seattle → Londra).
  • Fan-out/fan-in: Beş şehirde etkinlikleri paralel olarak çağırır ve ardından sonuçları toplar.

Sonunda, Durable Task Scheduler öykünücüsüyle her iki orkestrasyonu da yerel olarak çalıştırıyor olacak ve bunların durumunu gösterge panelinde görüntüleyebileceksiniz.

  • Hello Cities örnek projesini kopyalayın ve hazırlayın.
  • Yerel geliştirme için Durable Task Scheduler öykünücüsünü ve Azurite'ı kurup yapılandırın.
  • İşlev uygulamasını derleyip çalıştırın ve her iki orkestrasyonu da tetikleyin.
  • Dayanıklı Görev Zamanlayıcı panosunda düzenleme durumunu ve çıktıyı gözden geçirin.

Prerequisites

Dayanıklı Görev Zamanlayıcı öykünücüsünü ayarlayın

Durable Task Scheduler emülatörü, Azure aboneliği olmadan orkestrasyonları test edebilmeniz için yerel bir geliştirme ortamı sağlar. Java İşlevleri konağı ayrıca yerel depolama için Azurite gerektirir.

Her iki kapsayıcıyı da başlatın:

docker run -d --name dtsemulator -p 8080:8080 -p 8082:8082 \
  mcr.microsoft.com/dts/dts-emulator:latest

docker run -d --name azurite -p 10000:10000 -p 10001:10001 -p 10002:10002 \
  mcr.microsoft.com/azure-storage/azurite

Tavsiye

Öykünücü çalıştırıldıktan sonra, düzenlemeleri izlemek için adresindeki http://localhost:8082 Dayanıklı Görev Zamanlayıcı panosuna erişebilirsiniz.

Hızlı başlangıç örneğini çalıştırma

  1. Hello Cities örnek dizinine gidin:

    cd samples/durable-functions/java/HelloCities
    
  2. local.settings.json Dosyanın aşağıdaki yapılandırmayı içerdiğini doğrulayın:

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "java",
        "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
      }
    }
    
  3. Projeyi oluşturun:

    mvn clean package
    
  4. İşlev uygulamasını başlatın:

    mvn azure-functions:run
    
  5. Ayrı bir terminalde işlev zincirleme düzenlemesini tetikleyin :

    $response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartChaining
    $response
    

    Yanıt, düzenleme örneğinin durum URL'lerini içerir. statusQueryGetUri Değeri kopyalayın ve çalıştırarak sonucu denetleyin:

    Invoke-RestMethod -Uri $response.statusQueryGetUri
    
  6. fan-out/fan-in orkestrasyonunu tetikleyin:

    $response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartFanOutFanIn
    Invoke-RestMethod -Uri $response.statusQueryGetUri
    

Beklenen çıkış

POST isteği durum URL'lerine sahip bir JSON yanıtı döndürür. Örneğin:

{
  "id": "<instanceId>",
  "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/<instanceId>?code=...",
  "sendEventPostUri": "...",
  "terminatePostUri": "...",
  "purgeHistoryDeleteUri": "..."
}

statusQueryGetUri sorguladığınızda ve orkestrasyonun runtimeStatus değeri Completed olduğunda, selamlama sonuçlarını output alanında bulabilirsiniz. Zincirleme düzenlemesi şunu döndürür:

{
  "name": "ChainingOrchestration",
  "runtimeStatus": "Completed",
  "output": "Hello Tokyo! Hello Seattle! Hello London!"
}

Fan-out/fan-in orkestrasyonu şunu döndürür:

{
  "name": "FanOutFanInOrchestration",
  "runtimeStatus": "Completed",
  "output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!", "Hello Paris!", "Hello Berlin!"]
}

Tavsiye

runtimeStatus, Running veya Pending gösteriyorsa, bir süre bekleyin ve statusQueryGetUri öğesini yeniden sorgulayın.

Orkestrasyon durumunu ve yürütme geçmişini görüntülemek için http://localhost:8082 konumundaki Dayanıklı Görev Zamanlayıcı panosunu açın.

Kodu anlama

src/main/java/com/example/Functions.java'daki örnek proje, bir Dayanıklı İşlevler uygulaması için gereken üç işlev türünün tümünü içerir.

Aktivite işlevi

SayHello etkinliği bir şehir adı alır ve bir selamlama döndürür:

@FunctionName("SayHello")
public String sayHello(
        @DurableActivityTrigger(name = "city") String city) {
    return "Hello " + city + "!";
}

Orchestrator işlevleri

Zincirleme orkestratör, SayHello öğesini üç şehir için sırayla çağırır:

@FunctionName("ChainingOrchestration")
public String chainingOrchestration(
        @DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {

    String result = "";
    result += ctx.callActivity("SayHello", "Tokyo", String.class).await();
    result += " " + ctx.callActivity("SayHello", "Seattle", String.class).await();
    result += " " + ctx.callActivity("SayHello", "London", String.class).await();
    return result;
}

fan-out/fan-in orchestrator, etkinlikleri paralel olarak planlar:

@FunctionName("FanOutFanInOrchestration")
public List<String> fanOutFanInOrchestration(
        @DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {

    String[] cities = {"Tokyo", "Seattle", "London", "Paris", "Berlin"};
    List<Task<String>> parallelTasks = new ArrayList<>();

    for (String city : cities) {
        parallelTasks.add(ctx.callActivity("SayHello", city, String.class));
    }

    List<String> results = new ArrayList<>();
    for (Task<String> task : parallelTasks) {
        results.add(task.await());
    }

    return results;
}

İstemci işlevleri

HTTP ile tetiklenen istemci işlevleri her düzenlemeyi başlatır:

@FunctionName("StartChaining")
public HttpResponseMessage startChaining(
        @HttpTrigger(name = "req", methods = {HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Void> request,
        @DurableClientInput(name = "durableContext") DurableClientContext durableContext) {

    DurableTaskClient client = durableContext.getClient();
    String instanceId = client.scheduleNewOrchestrationInstance("ChainingOrchestration");
    return durableContext.createCheckStatusResponse(request, instanceId);
}

Configuration

Örnek, depolama altyapısı olarak Durable Task Scheduler öykünücüsünü kullanır. Bu, host.json içinde yapılandırılır:

{
  "extensions": {
    "durableTask": {
      "hubName": "default",
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
      }
    }
  }
}

Öykünücü bağlantı dizesi, local.settings.json içinde ayarlanır:

{
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "java",
    "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
  }
}

Kaynakları temizle

İşiniz bittiğinde öykünücü kapsayıcılarını durdurun:

docker stop dtsemulator azurite && docker rm dtsemulator azurite

Sonraki Adımlar