Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Orchestrierungen sind lang laufende, zustandsbehaftete Workflows, die Sie mithilfe integrierter Management-APIs starten, abfragen, anhalten, fortsetzen und beenden können. In Durable Functions macht die orchestration client binding diese APIs verfügbar. In den SDKs für dauerhafte Aufgaben sind diese Vorgänge über die DurableTaskClient Klasse verfügbar. In diesem Artikel werden alle unterstützten Instanzenverwaltungsvorgänge für beide Plattformen behandelt.
Tipp
Der Azure Durable Task Scheduler ist das empfohlene Back-End sowohl für Durable Functions als auch für dauerhafte Aufgaben-SDKs, die eine vollständig verwaltete, serverlose Oberfläche für die Ausführung dauerhafter Workflows im Großen und Ganzen bieten.
Starten von Instanzen
Die start-new ( oder schedule-new) Methode für den Orchestrierungsclient startet eine neue Orchestrierungsinstanz. Intern schreibt diese Methode eine Nachricht in das konfigurierte Back-End (z. B. den Durable Task Scheduler oder Azure Storage) und gibt dann zurück. Diese Nachricht löst asynchron den Beginn einer Orchestrierung mit dem angegebenen Namen aus.
Hier sind die Parameter zum Starten einer neuen Orchestrierungsinstanz:
- Name: Der Name der Orchestratorfunktion, die zu planen ist.
- Eingabe: Alle JSON-serialisierbaren Daten, die als Eingabe an die Orchestratorfunktion übergeben werden sollen.
- InstanceId: (Optional) Die eindeutige ID der Instanz. Wenn Sie diesen Parameter nicht angeben, verwendet die Methode eine zufällige ID.
Tipp
Verwenden Sie nach Möglichkeit einen zufälligen Bezeichner für die Instanz-ID. Zufällige Instanz-IDs sorgen dafür, dass eine gleichmäßige Lastverteilung gewährleistet wird, wenn Sie Orchestratorfunktionen auf mehrere VMs skalieren. Die richtige Zeit für die Verwendung nicht benutzerdefinierter Instanz-IDs ist, wenn die ID von einer externen Quelle stammt oder wenn Sie das Singleton Orchestrator-Muster implementieren.
- Name: Der Name der zu planenden Orchestrierung.
- Eingabe: Alle JSON-serialisierbaren Daten, die als Eingabe an die Orchestrierung übergeben werden sollen.
- InstanceId: (Optional) Die eindeutige ID der Instanz. Wenn Sie diesen Parameter nicht angeben, verwendet die Methode eine zufällige ID.
Tipp
Verwenden Sie nach Möglichkeit einen zufälligen Bezeichner für die Instanz-ID. Zufällige Instanz-IDs tragen dazu bei, eine gleiche Lastverteilung sicherzustellen, wenn Sie Orchestrierungen über mehrere VMs hinweg skalieren. Die richtige Zeit für die Verwendung nicht benutzerdefinierter Instanz-IDs ist, wenn die ID von einer externen Quelle stammt oder wenn Sie das Singleton Orchestrator-Muster implementieren.
Die folgende Beispielfunktion startet eine neue Orchestrierungsinstanz:
[FunctionName("HelloWorldQueueTrigger")]
public static async Task Run(
[QueueTrigger("start-queue")] string input,
[DurableClient] IDurableOrchestrationClient starter,
ILogger log)
{
string instanceId = await starter.StartNewAsync("HelloWorld", input);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
}
Hinweis
Der vorherige C#-Code gilt für Durable Functions 2.x. Verwenden Sie für Durable Functions 1.x das Attribut OrchestrationClient anstelle des Attributs DurableClient, und verwenden Sie den Parametertyp DurableOrchestrationClient anstelle von IDurableOrchestrationClient. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie unter Durable Functions-Versionen.
Von Bedeutung
Derzeit ist das PowerShell Durable Task SDK nicht verfügbar.
Der folgende Code zeigt, wie Sie eine neue Orchestrierungsinstanz mithilfe der SdKs für dauerhafte Aufgaben starten:
using Microsoft.DurableTask.Client;
// Schedule a new orchestration instance
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync("HelloWorld", input);
Console.WriteLine($"Started orchestration with ID = '{instanceId}'.");
// Optionally, wait for the orchestration to start
OrchestrationMetadata metadata = await client.WaitForInstanceStartAsync(instanceId, timeout: TimeSpan.FromSeconds(30));
Abfragen von Instanzen
Nachdem Sie neue Orchestrierungsinstanzen gestartet haben, müssen Sie wahrscheinlich den Laufzeitstatus abfragen, um zu erfahren, ob sie ausgeführt, abgeschlossen oder fehlgeschlagen sind.
Die Get-Status-Methode für den Orchestrierungsclient gibt den Status einer Orchestrierungsinstanz zurück.
Es akzeptiert ein instanceId (erforderlich), showHistory (optional), showHistoryOutput (optional) und showInput (optional) als Parameter.
-
showHistory: Wenn dieser Wert festgelegt isttrue, enthält die Antwort den Ausführungsverlauf. -
showHistoryOutput: Wenn dieser Wert auftruefestgelegt ist, enthält der Ausführungsverlauf Aktivitätsausgaben. -
showInput: Wenn diese Einstellungfalsefestgelegt ist, enthält die Antwort nicht die Eingabe der Funktion. Der Standardwert isttrue.
Die Methode gibt ein Objekt mit den folgenden Eigenschaften zurück:
- Name: Der Name der Orchestratorfunktion.
-
InstanceId: Die Instanz-ID der Orchestrierung (sollte mit der
instanceIdEingabe identisch sein). - CreatedTime: Der Zeitpunkt, zu dem die Orchestratorfunktion gestartet wird.
- LastUpdatedTime: Die Uhrzeit, zu der die Orchestrierung letzte Prüfpunkte hat.
-
Eingabe: Die Eingabe der Funktion als JSON-Wert. Dieses Feld wird nicht aufgefüllt, wenn
showInputdas der Fall istfalse. - CustomStatus: Benutzerdefinierter Orchestrierungsstatus im JSON-Format.
- Ausgabe: Die Ausgabe der Funktion als JSON-Wert (wenn die Funktion abgeschlossen ist). Wenn die Orchestratorfunktion fehlschlägt, enthält diese Eigenschaft die Fehlerdetails. Wenn die Orchestratorfunktion angehalten oder beendet wird, enthält diese Eigenschaft den Grund für das Anhalten oder Beenden (falls vorhanden).
-
RuntimeStatus: Einer der folgenden Werte:
- Ausstehend: Die Instanz ist eingeplant, aber noch nicht gestartet.
- Läuft: Die Instanz läuft.
- Abgeschlossen: Die Instanz wurde normal abgeschlossen.
- ContinuedAsNew: Die Instanz hat sich mit einer neuen Ablaufhistorie neu gestartet. Dieser Zustand ist ein vorübergehender Zustand.
- Fehler: Fehler bei der Instanz.
- Beendet: Die Instanz wurde abrupt beendet.
- Ausgesetzt: Die Instanz wird ausgesetzt und kann zu einem späteren Zeitpunkt fortgesetzt werden.
-
History: Der Ausführungsverlauf der Orchestrierung. Dieses Feld wird nur ausgefüllt, wenn
showHistoryauftruefestgelegt ist.
-
showHistory: Wenn dieser Wert festgelegt isttrue, enthält die Antwort den Ausführungsverlauf. -
showHistoryOutput: Wenn dieser Wert auftruefestgelegt ist, enthält der Ausführungsverlauf Aktivitätsausgaben. -
showInput: Wenn diese Option auffalseaktiviert ist, enthält die Antwort nicht die Orchestrierungseingabe. Der Standardwert isttrue.
Die Methode gibt ein Objekt mit den folgenden Eigenschaften zurück:
- Name: Der Name der Orchestrierung.
-
InstanceId: Die Instanz-ID der Orchestrierung (sollte mit der
instanceIdEingabe identisch sein). - CreatedTime: Der Zeitpunkt, zu dem die Orchestrierung gestartet wird.
- LastUpdatedTime: Die Uhrzeit, zu der die Orchestrierung den letzten Prüfpunkt setzt.
-
Eingabe: Die Eingabe der Orchestrierung als JSON-Wert. Dieses Feld wird nicht ausgefüllt, wenn
showInputfalseist. - CustomStatus: Benutzerdefinierter Orchestrierungsstatus im JSON-Format.
- Ausgabe: Die Ausgabe der Orchestrierung als JSON-Wert (wenn die Orchestrierung abgeschlossen ist). Wenn die Orchestrierung fehlschlägt, enthält diese Eigenschaft die Fehlerdetails. Wenn die Orchestrierung angehalten oder beendet wird, enthält diese Eigenschaft den Grund für die Aussetzung oder Beendigung (falls vorhanden).
-
RuntimeStatus: Einer der folgenden Werte:
- Ausstehend: Die Instanz ist eingeplant, wurde aber noch nicht gestartet.
- In Betrieb: Die Instanz ist in Betrieb.
- Abgeschlossen: Die Instanz wurde normal abgeschlossen.
- ContinuedAsNew: Die Instanz hat sich mit einer neuen Prozesshistorie neu gestartet. Dieser Zustand ist ein vorübergehender Zustand.
- Fehler: Fehler bei der Instanz.
- Beendet: Die Instanz wurde abrupt beendet.
- Ausgesetzt: Die Instanz ist ausgesetzt und kann zu einem späteren Zeitpunkt fortgesetzt werden.
-
History: Der Ausführungsverlauf der Orchestrierung. Dieses Feld wird nur ausgefüllt, wenn
showHistoryauftruefestgelegt ist.
Hinweis
Ein Orchestrator wird erst markiert, Completed wenn alle geplanten Vorgänge abgeschlossen sind und der Orchestrator zurückgegeben wird. Anders ausgedrückt: Es reicht nicht aus, dass ein Orchestrator seine return Aussage erreicht, damit er als Completedgekennzeichnet wird. Dies ist besonders für Fälle relevant, in denen WhenAny verwendet wird; diese Orchestratoren werden oft ausgeführt, bevor alle geplanten Aufgaben return.
Diese Methode gibt null (.NET und Java), undefined (JavaScript) oder None (Python) zurück, wenn die Instanz nicht vorhanden ist.
[FunctionName("GetStatus")]
public static async Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("check-status-queue")] string instanceId)
{
DurableOrchestrationStatus status = await client.GetStatusAsync(instanceId);
// do something based on the current status.
}
Hinweis
Der vorherige C#-Code gilt für Durable Functions 2.x. Verwenden Sie für Durable Functions 1.x das Attribut OrchestrationClient anstelle des Attributs DurableClient, und verwenden Sie den Parametertyp DurableOrchestrationClient anstelle von IDurableOrchestrationClient. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions versions.
using Microsoft.DurableTask.Client;
// Get the status of an orchestration instance
OrchestrationMetadata? metadata = await client.GetInstanceAsync(instanceId, getInputsAndOutputs: true);
if (metadata != null)
{
OrchestrationRuntimeStatus status = metadata.RuntimeStatus;
// do something based on the current status
}
Abfragen aller Instanzen
Sie können APIs in Ihrem Sprach-SDK verwenden, um die Status aller Orchestrierungsinstanzen in Ihrem Aufgabenhub abzufragen. Diese API "list-instances" oder "get-status" gibt eine Liste von Objekten zurück, die die Orchestrierungsinstanzen darstellen, die den Abfrageparametern entsprechen.
[FunctionName("GetAllStatus")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient client,
ILogger log)
{
var noFilter = new OrchestrationStatusQueryCondition();
OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
noFilter,
CancellationToken.None);
foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
{
log.LogInformation(JsonConvert.SerializeObject(instance));
}
// Note: ListInstancesAsync only returns the first page of results.
// To request additional pages provide the result.ContinuationToken
// to the OrchestrationStatusQueryCondition's ContinuationToken property.
}
Hinweis
Der vorherige C#-Code gilt für Durable Functions 2.x. Für Durable Functions 1.x müssen Sie das Attribut OrchestrationClient anstelle des Attributs DurableClient verwenden und den Parametertyp DurableOrchestrationClient anstelle von IDurableOrchestrationClient. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions versions.
using Microsoft.DurableTask.Client;
// Query all orchestration instances
AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(new OrchestrationQuery());
await foreach (OrchestrationMetadata instance in instances)
{
Console.WriteLine(instance.InstanceId);
}
Abfrageinstanzen mit Filtern
Was geschieht, wenn Sie nicht alle Informationen benötigen, die eine Standardinstanzabfrage bereitstellt? Wie wäre es zum Beispiel, wenn Sie nur nach der Erstellungszeit der Orchestrierung oder dem Laufzeitstatus der Orchestrierung suchen? Schränken Sie Ihre Abfrage ein, indem Sie Filter anwenden.
[FunctionName("QueryStatus")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient client,
ILogger log)
{
// Get the first 100 running or pending instances that were created between 7 and 1 days ago
var queryFilter = new OrchestrationStatusQueryCondition
{
RuntimeStatus = new[]
{
OrchestrationRuntimeStatus.Pending,
OrchestrationRuntimeStatus.Running,
},
CreatedTimeFrom = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)),
CreatedTimeTo = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
PageSize = 100,
};
OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
queryFilter,
CancellationToken.None);
foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
{
log.LogInformation(JsonConvert.SerializeObject(instance));
}
}
Hinweis
Der vorherige C#-Code gilt für Durable Functions 2.x. Für Durable Functions 1.x müssen Sie das Attribut OrchestrationClient anstelle des Attributs DurableClient verwenden und den Parametertyp DurableOrchestrationClient anstelle von IDurableOrchestrationClient. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions versions.
using Microsoft.DurableTask.Client;
// Get running or pending instances created in the last 7 days
var query = new OrchestrationQuery
{
Statuses = new[] { OrchestrationRuntimeStatus.Running, OrchestrationRuntimeStatus.Pending },
CreatedFrom = DateTime.UtcNow.AddDays(-7),
CreatedTo = DateTime.UtcNow.AddDays(-1),
PageSize = 100
};
AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(query);
await foreach (OrchestrationMetadata instance in instances)
{
Console.WriteLine($"{instance.InstanceId}: {instance.RuntimeStatus}");
}
Beenden von Instanzen
Wenn Sie eine Orchestrierungsinstanz haben, deren Ausführung zu lange dauert, oder wenn Sie sie aus irgendeinem Grund vor Abschluss beenden müssen, können Sie sie beenden.
Die beiden Parameter für die Beendigungs-API sind eine Instanz-ID und eine Grundzeichenfolge , die in Protokolle und in den Instanzstatus schreibt.
[FunctionName("TerminateInstance")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("terminate-queue")] string instanceId)
{
string reason = "Found a bug";
return client.TerminateAsync(instanceId, reason);
}
Hinweis
Der vorherige C#-Code gilt für Durable Functions 2.x. Für Durable Functions 1.x müssen Sie das Attribut OrchestrationClient anstelle des Attributs DurableClient verwenden und den Parametertyp DurableOrchestrationClient anstelle von IDurableOrchestrationClient. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions versions.
using Microsoft.DurableTask.Client;
string reason = "Found a bug";
await client.TerminateInstanceAsync(instanceId, reason);
Eine beendete Instanz wechselt schließlich in den Terminated Zustand. Dieser Übergang geschieht jedoch nicht sofort. Stattdessen wird der Beendigungsvorgang zusammen mit anderen Vorgängen für diese Instanz in die Warteschlange im Aufgabenhub gestellt. Sie können die Instanzabfrage-APIs verwenden, um zu wissen, wann eine beendete Instanz tatsächlich den Terminated Status erreicht hat.
Hinweis
Die Instanzbeendigung wird momentan nicht weitergegeben. Aktivitätsfunktionen und Unter-Orchestrierungen werden bis zum Abschluss ausgeführt, unabhängig davon, ob Sie die Orchestrierungsinstanz beenden, die sie aufgerufen hat.
Anhalten und Fortsetzen von Instanzen
Durch das Anhalten einer Orchestrierung können Sie eine laufende Orchestrierung beenden. Im Gegensatz zum Beenden einer Orchestrierung können Sie später einen angehaltenen Orchestrator fortsetzen.
Die beiden Parameter für die Suspend-API sind eine Instanz-ID und ein Begründungstext, die in die Protokolle und den Instanzstatus geschrieben werden.
[FunctionName("SuspendResumeInstance")]
public static async Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("suspend-resume-queue")] string instanceId)
{
// To suspend an orchestration
string suspendReason = "Need to pause workflow";
await client.SuspendAsync(instanceId, suspendReason);
// To resume an orchestration
string resumeReason = "Continue workflow";
await client.ResumeAsync(instanceId, resumeReason);
}
using Microsoft.DurableTask.Client;
// To suspend an orchestration
string suspendReason = "Need to pause workflow";
await client.SuspendInstanceAsync(instanceId, suspendReason);
// To resume an orchestration
string resumeReason = "Continue workflow";
await client.ResumeInstanceAsync(instanceId, resumeReason);
Eine angehaltene Instanz wechselt schließlich in den Suspended-Zustand. Dieser Übergang geschieht jedoch nicht sofort. Stattdessen wird der Suspendierungsvorgang zusammen mit anderen Vorgängen für diese Instanz im Task-Hub in die Warteschlange gestellt. Verwenden Sie die Instanzabfrage-APIs, um zu wissen, wann eine ausgeführte Instanz tatsächlich den Suspended Status erreicht hat.
Wenn ein angehaltener Orchestrator wieder aufgenommen wird, ändert sich der Status wieder in Running.
Senden von Ereignissen an Instanzen
In einigen Szenarien müssen Orchestratorfunktionen warten und auf externe Ereignisse lauschen. Beispiele für diesen Ansatz sind die Überwachungs- und Interaktionsszenarien.
In einigen Szenarien müssen Orchestrierungen warten und auf externe Ereignisse lauschen. Beispiele für diesen Ansatz sind die Überwachung und Interaktionsszenarien.
Sie können Ereignisbenachrichtigungen an ausgeführte Instanzen senden, indem Sie die Auslösen-Ereignis-API des Orchestrierungsclients verwenden. Orchestrierungen können diese Ereignisse überwachen und darauf reagieren, indem sie die Warten auf externes Ereignis Orchestrator-API verwenden.
Die Parameter für das Auslösen-Ereignis sind:
- Instanz-ID: Die eindeutige ID der Instanz.
- Ereignisname: Der Name des zu sendenden Ereignisses.
- Ereignisdaten: Eine JSON-serialisierbare Nutzlast, die an die Instanz gesendet werden soll.
[FunctionName("RaiseEvent")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("event-queue")] string instanceId)
{
int[] eventData = new int[] { 1, 2, 3 };
return client.RaiseEventAsync(instanceId, "MyEvent", eventData);
}
Hinweis
Der vorherige C#-Code gilt für Durable Functions 2.x. Für Durable Functions 1.x müssen Sie das Attribut OrchestrationClient anstelle des Attributs DurableClient verwenden und den Parametertyp DurableOrchestrationClient anstelle von IDurableOrchestrationClient. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions versions.
using Microsoft.DurableTask.Client;
int[] eventData = new int[] { 1, 2, 3 };
await client.RaiseEventAsync(instanceId, "MyEvent", eventData);
Hinweis
Wenn keine Orchestrierungsinstanz mit der angegebenen Instanz-ID vorhanden ist, wird die Ereignismeldung verworfen. Wenn eine Instanz vorhanden ist, aber noch nicht auf das Ereignis wartet, wird das Ereignis im Instanzzustand gespeichert, bis es bereit ist, empfangen und verarbeitet zu werden.
Warten auf den Abschluss der Orchestrierung
Bei langfristigen Orchestrierungen sollten Sie warten und die Ergebnisse einer Orchestrierung erhalten. In diesen Fällen ist es auch hilfreich, einen Timeoutzeitraum für die Orchestrierung zu definieren. Wenn das Timeout überschritten wird, wird der Zustand der Orchestrierung anstelle der Ergebnisse zurückgegeben.
Verwenden Sie die API "Auf Abschluss warten oder Statusüberprüfung erstellen", um die tatsächliche Ausgabe einer Orchestrierungsinstanz synchron abzurufen. Diese Methode hat standardmäßig ein Timeout von zehn Sekunden und ein Polling-Intervall von einer Sekunde.
Hier ist eine Beispielfunktion für HTTP-Trigger, die die Verwendung dieser API veranschaulicht:
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
namespace VSSample
{
public static class HttpSyncStart
{
private const string Timeout = "timeout";
private const string RetryInterval = "retryInterval";
[FunctionName("HttpSyncStart")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}/wait")]
HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient starter,
string functionName,
ILogger log)
{
// Function input comes from the request content.
object eventData = await req.Content.ReadAsAsync<object>();
string instanceId = await starter.StartNewAsync(functionName, eventData);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
TimeSpan timeout = GetTimeSpan(req, Timeout) ?? TimeSpan.FromSeconds(30);
TimeSpan retryInterval = GetTimeSpan(req, RetryInterval) ?? TimeSpan.FromSeconds(1);
return await starter.WaitForCompletionOrCreateCheckStatusResponseAsync(
req,
instanceId,
timeout,
retryInterval);
}
private static TimeSpan? GetTimeSpan(HttpRequestMessage request, string queryParameterName)
{
string queryParameterStringValue = request.RequestUri.ParseQueryString()[queryParameterName];
if (string.IsNullOrEmpty(queryParameterStringValue))
{
return null;
}
return TimeSpan.FromSeconds(double.Parse(queryParameterStringValue));
}
}
}
Die Durable Task SDKs bieten eine Methode, um synchrones Warten auf den Abschluss einer Orchestrierung zu ermöglichen.
using Microsoft.DurableTask.Client;
// Wait for orchestration to complete with a timeout
OrchestrationMetadata metadata = await client.WaitForInstanceCompletionAsync(
instanceId,
timeout: TimeSpan.FromSeconds(30),
getInputsAndOutputs: true);
if (metadata.RuntimeStatus == OrchestrationRuntimeStatus.Completed)
{
Console.WriteLine($"Output: {metadata.SerializedOutput}");
}
Rufen Sie die Funktion mit der folgenden Zeile auf. Verwenden Sie zwei Sekunden für das Timeout und 0,5 Sekunden für das Wiederholungsintervall:
curl -X POST "http://localhost:7071/orchestrators/E1_HelloSequence/wait?timeout=2&retryInterval=0.5"
Hinweis
Der obige cURL-Befehl geht davon aus, dass Sie über eine Orchestratorfunktion verfügen, die in Ihrem Projekt benannt ist E1_HelloSequence . Aufgrund der Art und Weise, wie die HTTP-Triggerfunktion geschrieben wird, können Sie sie durch den Namen jeder Orchestratorfunktion in Ihrem Projekt ersetzen.
Je nachdem, wie lange die Antwort von der Orchestrierungsinstanz abgerufen werden muss, gibt es zwei Fälle:
- Die Orchestrierungsinstanzen enden innerhalb des definierten Timeouts (in diesem Fall zwei Sekunden), und die Antwort ist die tatsächliche Orchestrierungsinstanzausgabe, die synchron bereitgestellt wird:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:14:29 GMT
Transfer-Encoding: chunked
[
"Hello Tokyo!",
"Hello Seattle!",
"Hello London!"
]
- Die Orchestrierungsinstanzen können nicht innerhalb des definierten Timeouts abgeschlossen werden, und die Antwort ist die Standardinstanz, die in der HTTP-API-URL-Ermittlung beschrieben wird:
HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:13:51 GMT
Location: http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}
Retry-After: 10
Transfer-Encoding: chunked
{
"id": "d3b72dddefce4e758d92f4d411567177",
"sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/raiseEvent/{eventName}?taskHub={taskHub}&connection={connection}&code={systemKey}",
"statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}",
"terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/terminate?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
"suspendPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/suspend?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
"resumePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/resume?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}"
}
Hinweis
Das Format der Webhook-URLs kann je nachdem, welche Version des Azure Functions Hosts Sie ausführen, unterschiedlich sein. Das vorherige Beispiel ist für den Azure Functions 3.0-Host vorgesehen.
Abrufen der HTTP-Verwaltungswebhook-URLs
Verwenden Sie ein externes System, um Ereignisse in einer Orchestrierung zu überwachen oder auszulösen. Externe Systeme kommunizieren mit Durable Functions über die Webhook-URLs, die Teil der in HTTP API URL Discovery beschriebenen Standardantwort sind. Auf die Webhook-URLs kann alternativ programmgesteuert über die Orchestrierungsclientbindung zugegriffen werden. Insbesondere erhält die API zur Erstellung einer HTTP-Verwaltungsnutzlast ein serialisierbares Objekt, das diese Webhook-URLs enthält.
Die API zur Erstellung einer HTTP-Verwaltungsnutzlast hat einen Parameter:
- Instanz-ID: Die eindeutige ID der Instanz.
Die Methoden geben ein Objekt mit den folgenden Zeichenfolgeneigenschaften zurück:
-
ID: Die Instanz-ID der Orchestrierung (sollte mit der
InstanceIdEingabe identisch sein). - StatusQueryGetUri: Die Status-URL der Orchestrierungsinstanz.
- SendEventPostUri: Die URL der Orchestrierungsinstanz zum Auslösen eines Ereignisses.
- TerminatePostUri: URL der Orchestrierungsinstanz für das „Beenden“.
- PurgeHistoryDeleteUri: Die URL „Verlauf löschen“ der Orchestrierungsinstanz.
- SuspendPostUri: Die "Suspend"-URL der Orchestrierungsinstanz.
- ResumePostUri: Die „Resume“-URL der Orchestrierungsinstanz.
Funktionen senden Instanzen dieser Objekte an externe Systeme, um Ereignisse für die entsprechenden Orchestrierungen zu überwachen oder auszulösen, wie in den folgenden Beispielen gezeigt.
[FunctionName("SendInstanceInfo")]
public static void SendInstanceInfo(
[ActivityTrigger] IDurableActivityContext ctx,
[DurableClient] IDurableOrchestrationClient client,
[CosmosDB(
databaseName: "MonitorDB",
containerName: "HttpManagementPayloads",
Connection = "CosmosDBConnectionSetting")]out dynamic document)
{
HttpManagementPayload payload = client.CreateHttpManagementPayload(ctx.InstanceId);
// send the payload to Azure Cosmos DB
document = new { Payload = payload, id = ctx.InstanceId };
}
Hinweis
Der vorherige C#-Code gilt für Durable Functions 2.x. Verwenden Sie für Durable Functions 1.x DurableActivityContext anstelle von IDurableActivityContext das attribut OrchestrationClient anstelle des Attributs DurableClient, und verwenden Sie den parametertyp DurableOrchestrationClient anstelle von IDurableOrchestrationClient. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions versions.
Instanzen neu starten
Wenn aus unerwartetem Grund ein Orchestrierungsfehler auftritt, setzen Sie die Instanz mithilfe einer dafür erstellten API in einen zuvor fehlerfreien Zustand zurück.
Hinweis
Diese API ist nicht als Ersatz für ordnungsgemäße Fehlerbehandlungs- und Wiederholungsrichtlinien gedacht. Stattdessen soll es nur in Fällen verwendet werden, in denen Orchestrierungsinstanzen aus unerwarteten Gründen fehlschlagen. Orchestrierungen in anderen Zuständen als Failed (z. B. Running, Pending, Terminated oder Completed) können nicht "zurückgespult" werden. Weitere Informationen zur Fehlerbehandlungs- und Wiederholungsrichtlinien finden Sie im Artikel zur Fehlerbehandlung .
Verwenden Sie die RewindAsync (.NET)- oder rewind (JavaScript)-Methode der Orchestrierungs-Clientbindung, um die Orchestrierung wieder in den Zustand Running zu versetzen. Diese Methode führt auch die Aktivitäts- oder Suborchestrationsausführungsfehler erneut aus, die den Orchestrierungsfehler verursacht haben.
Angenommen, Sie haben einen Workflow mit einer Reihe von menschlichen Genehmigungen. Angenommen, eine Reihe von Aktivitätsfunktionen benachrichtigt eine Person darüber, dass ihre Genehmigung erforderlich ist, und wartet auf die Antwort in Echtzeit. Nachdem alle Genehmigungsaktivitäten entweder eine Antwort erhalten oder ein Timeout erleiden, könnte eine weitere Aktivität aufgrund einer fehlerhaften Anwendungskonfiguration fehlschlagen, wie beispielsweise bei einer ungültigen Datenbank-Verbindungszeichenfolge. Das Ergebnis ist ein Orchestrierungsfehler tief im Workflow. Mit der API RewindAsync (.NET) oder rewind (JavaScript) kann ein Anwendungsadministrator den Konfigurationsfehler beheben und die fehlgeschlagene Orchestrierung unmittelbar vor dem Fehler zurückspulen. Keiner der Schritte für die menschliche Interaktion muss erneut genehmigt werden, und die Orchestrierung kann jetzt erfolgreich abgeschlossen werden.
Hinweis
Das Rewind-Feature unterstützt keine Zurückspulen von Orchestrierungsinstanzen, die dauerhafte Zeitgeber verwenden.
[FunctionName("RewindInstance")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("rewind-queue")] string instanceId)
{
string reason = "Orchestrator failed and needs to be revived.";
return client.RewindAsync(instanceId, reason);
}
Hinweis
Der vorherige C#-Code gilt für Durable Functions 2.x. Für Durable Functions 1.x müssen Sie das Attribut OrchestrationClient anstelle des Attributs DurableClient verwenden und den Parametertyp DurableOrchestrationClient anstelle von IDurableOrchestrationClient. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions versions.
using Microsoft.DurableTask.Client;
string reason = "Orchestrator failed and needs to be revived.";
await client.RewindInstanceAsync(instanceId, reason);
Instanzen neu starten
Durch den Neustart einer Orchestrierung wird eine neue Instanz mithilfe des Verlaufs einer zuvor ausgeführten Instanz erstellt. Dieses Feature ist nützlich, wenn Sie eine Orchestrierung mit demselben Eingabe- und Instanz-ID-Muster erneut ausführen möchten, um eine neue Ausführung basierend auf dem Original zu erstellen.
[FunctionName("RestartInstance")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("restart-queue")] string instanceId)
{
return client.RestartAsync(instanceId, restartWithNewInstanceId: true);
}
Hinweis
Der vorherige C#-Code gilt für Durable Functions 2.x. Für Durable Functions 1.x müssen Sie das Attribut OrchestrationClient anstelle des Attributs DurableClient verwenden und den Parametertyp DurableOrchestrationClient anstelle von IDurableOrchestrationClient. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions versions.
using Microsoft.DurableTask.Client;
// Restart an orchestration with a new instance ID
string newInstanceId = await client.RestartInstanceAsync(instanceId, restartWithNewInstanceId: true);
Console.WriteLine($"Restarted as new instance: {newInstanceId}");
// Restart an orchestration keeping the same instance ID
await client.RestartInstanceAsync(instanceId, restartWithNewInstanceId: false);
Instanzverlauf löschen
Wenn Sie alle mit einer Orchestrierung verknüpften Daten entfernen möchten, löschen Sie den Instanzverlauf. Löschen Sie beispielsweise alle Speicherressourcen, die einer abgeschlossenen Instanz zugeordnet sind. Verwenden Sie die vom Orchestrierungsclient definierte Bereinigungsinstanz-API.
Das folgende Beispiel zeigt, wie Sie eine einzelne Orchestrierungsinstanz löschen.
[FunctionName("PurgeInstanceHistory")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("purge-queue")] string instanceId)
{
return client.PurgeInstanceHistoryAsync(instanceId);
}
using Microsoft.DurableTask.Client;
// Purge a single orchestration instance
PurgeResult result = await client.PurgeInstanceAsync(instanceId);
Console.WriteLine($"Purged {result.PurgedInstanceCount} instance(s).");
Das folgende Beispiel zeigt eine timer-gesteuerte Funktion, die den Verlauf für alle Orchestrierungsinstanzen löscht, die nach Ablauf des angegebenen Zeitintervalls abgeschlossen wurden. In diesem Fall werden Daten für alle Vorgänge entfernt, die vor 30 oder mehr Tagen abgeschlossen wurden. Diese Beispielfunktion soll einmal pro Tag und um 12:00 Uhr UTC ausgeführt werden:
[FunctionName("PurgeInstanceHistory")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[TimerTrigger("0 0 12 * * *")] TimerInfo myTimer)
{
return client.PurgeInstanceHistoryAsync(
DateTime.MinValue,
DateTime.UtcNow.AddDays(-30),
new List<OrchestrationStatus>
{
OrchestrationStatus.Completed
});
}
Hinweis
Der vorherige C#-Code gilt für Durable Functions 2.x. Für Durable Functions 1.x müssen Sie das Attribut OrchestrationClient anstelle des Attributs DurableClient verwenden und den Parametertyp DurableOrchestrationClient anstelle von IDurableOrchestrationClient. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions versions.
using Microsoft.DurableTask.Client;
// Purge completed instances older than 30 days
var filter = new PurgeInstancesFilter(
CreatedFrom: DateTime.MinValue,
CreatedTo: DateTime.UtcNow.AddDays(-30),
Statuses: new[] { OrchestrationRuntimeStatus.Completed });
PurgeResult result = await client.PurgeAllInstancesAsync(filter);
Console.WriteLine($"Purged {result.PurgedInstanceCount} instance(s).");
Hinweis
Damit der Löschverlaufsvorgang erfolgreich ausgeführt werden kann, muss der Laufzeitstatus der Zielinstanz abgeschlossen, beendet oder fehlgeschlagen sein.