Skip to Content
DocsClientsDotnetProcessesProzess-Instanzen abfragen

Prozess-Instanzen abfragen

Der ProcessInstancesClient ermöglicht das Abfragen und Filtern von Prozess-Instanzen mit flexiblen Suchkriterien.

QueryAsync()

Fragt Prozess-Instanzen mit Filtern ab:

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessInstancesClient(engineAddress); // Alle laufenden Prozesse abfragen var instances = await client.QueryAsync(query => { query.FilterByState(ProcessState.Running); }); Console.WriteLine($"Gefunden: {instances.Count} laufende Prozesse"); foreach (var instance in instances) { Console.WriteLine($" - {instance.Id} ({instance.ProcessModelId})"); }

Filter-Optionen

Nach ProcessInstanceId

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessInstancesClient(engineAddress); var processInstanceId = "abc-123-def-456"; var instances = await client.QueryAsync(query => { query.FilterByProcessInstanceId(processInstanceId); }); var instance = instances.SingleOrDefault(); if (instance != null) { Console.WriteLine($"Prozess gefunden: {instance.Id}"); Console.WriteLine($" Status: {instance.State}"); Console.WriteLine($" Model: {instance.ProcessModelId}"); } else { Console.WriteLine("Prozess-Instanz nicht gefunden"); }

Nach ProcessModelId

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessInstancesClient(engineAddress); // Alle Instanzen eines bestimmten Prozessmodells var instances = await client.QueryAsync(query => { query.FilterByProcessModelId("OrderProcess"); }); Console.WriteLine($"Order-Prozesse: {instances.Count}"); // Gruppierung nach Status var byStatus = instances .GroupBy(i => i.State) .Select(g => new { State = g.Key, Count = g.Count() }); foreach (var group in byStatus) { Console.WriteLine($" {group.State}: {group.Count}"); }

Nach CorrelationId

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessInstancesClient(engineAddress); var correlationId = "ORDER-2025-001"; // Alle Prozesse mit derselben Correlation-ID var instances = await client.QueryAsync(query => { query.FilterByCorrelationId(correlationId); }); Console.WriteLine($"Prozesse mit Correlation '{correlationId}': {instances.Count}"); foreach (var instance in instances) { Console.WriteLine($" - {instance.ProcessModelId}: {instance.State}"); }

Correlation-IDs ermöglichen es, mehrere zusammenhängende Prozess-Instanzen zu gruppieren und gemeinsam abzufragen.

Nach Status (State)

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessInstancesClient(engineAddress); // Einzelner Status var runningInstances = await client.QueryAsync(query => { query.FilterByState(ProcessState.Running); }); Console.WriteLine($"Laufende Prozesse: {runningInstances.Count}"); // Mehrere Status var endedInstances = await client.QueryAsync(query => { query.FilterByStates( ProcessState.Finished, ProcessState.Error, ProcessState.Terminated ); }); Console.WriteLine($"Beendete Prozesse: {endedInstances.Count}");

Kombinierte Filter

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessInstancesClient(engineAddress); // Mehrere Filter kombinieren var instances = await client.QueryAsync(query => { query.FilterByProcessModelId("OrderProcess"); query.FilterByState(ProcessState.Running); }); Console.WriteLine($"Laufende Order-Prozesse: {instances.Count}");

ProcessInstance Properties

Eine ProcessInstance enthält folgende wichtige Properties:

PropertyTypBeschreibung
IdstringEindeutige ID der Instanz
ProcessModelIdstringID des Prozessmodells
CorrelationIdstringCorrelation-ID
StateProcessStateAktueller Status
CreatedAtDateTimeErstellungszeitpunkt
FinishedAtDateTime?Endzeitpunkt (falls beendet)
IdentityIdentityIdentität des Starters

ProcessState Enum

StateBeschreibung
RunningProzess läuft aktuell
SuspendedProzess wartet (z.B. auf User Task)
FinishedProzess erfolgreich beendet
ErrorProzess mit Fehler beendet
TerminatedProzess wurde manuell abgebrochen

Prozess-Details abrufen

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessInstancesClient(engineAddress); var processInstanceId = "abc-123"; var instances = await client.QueryAsync(query => { query.FilterByProcessInstanceId(processInstanceId); }); var instance = instances.SingleOrDefault(); if (instance != null) { Console.WriteLine($"Prozess-Instanz: {instance.Id}"); Console.WriteLine($" Model: {instance.ProcessModelId}"); Console.WriteLine($" Status: {instance.State}"); Console.WriteLine($" Correlation: {instance.CorrelationId}"); Console.WriteLine($" Erstellt: {instance.CreatedAt:yyyy-MM-dd HH:mm:ss}"); if (instance.FinishedAt.HasValue) { var duration = instance.FinishedAt.Value - instance.CreatedAt; Console.WriteLine($" Beendet: {instance.FinishedAt:yyyy-MM-dd HH:mm:ss}"); Console.WriteLine($" Dauer: {duration.TotalSeconds:F2} Sekunden"); } else { var runningTime = DateTime.UtcNow - instance.CreatedAt; Console.WriteLine($" Laufzeit: {runningTime.TotalMinutes:F1} Minuten"); } if (instance.Identity != null) { Console.WriteLine($" Gestartet von: {instance.Identity.UserId}"); } }

Status überwachen (Polling)

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var definitionsClient = ClientFactory.CreateProcessDefinitionsClient(engineAddress); var instancesClient = ClientFactory.CreateProcessInstancesClient(engineAddress); // Prozess starten var response = await definitionsClient.StartProcessInstanceAsync( processModelId: "DataProcessing", startEventId: "StartEvent_1", initialToken: new { dataId = "DATA-789" } ); var processInstanceId = response.ProcessInstanceId; Console.WriteLine($"Prozess gestartet: {processInstanceId}"); // Status überwachen bis Prozess beendet ist var isRunning = true; while (isRunning) { await Task.Delay(2000); // 2 Sekunden warten var instances = await instancesClient.QueryAsync(query => { query.FilterByProcessInstanceId(processInstanceId); }); var instance = instances.SingleOrDefault(); if (instance == null) { Console.WriteLine("Prozess nicht gefunden"); break; } Console.WriteLine($"Status: {instance.State}"); // Prüfen ob beendet switch (instance.State) { case ProcessState.Finished: Console.WriteLine("✓ Prozess erfolgreich abgeschlossen"); isRunning = false; break; case ProcessState.Error: Console.WriteLine("✗ Prozess mit Fehler beendet"); isRunning = false; break; case ProcessState.Terminated: Console.WriteLine("⊘ Prozess wurde abgebrochen"); isRunning = false; break; case ProcessState.Running: Console.WriteLine("⟳ Prozess läuft..."); break; case ProcessState.Suspended: Console.WriteLine("⏸ Prozess wartet..."); break; } }

Polling sollte mit Bedacht eingesetzt werden. Für Echtzeit-Updates sollten Sie stattdessen Event-basierte Mechanismen oder SignalR verwenden.

Statistiken erstellen

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessInstancesClient(engineAddress); // Alle Instanzen eines Prozessmodells abrufen var instances = await client.QueryAsync(query => { query.FilterByProcessModelId("OrderProcess"); }); Console.WriteLine("Order-Prozess Statistiken:"); Console.WriteLine($" Gesamt: {instances.Count}"); // Nach Status gruppieren var stats = instances .GroupBy(i => i.State) .Select(g => new { State = g.Key, Count = g.Count(), Percentage = (g.Count() * 100.0) / instances.Count }) .OrderByDescending(s => s.Count); foreach (var stat in stats) { Console.WriteLine($" {stat.State}: {stat.Count} ({stat.Percentage:F1}%)"); } // Durchschnittliche Laufzeit berechnen (nur beendete Prozesse) var finishedInstances = instances .Where(i => i.FinishedAt.HasValue) .ToList(); if (finishedInstances.Any()) { var avgDuration = finishedInstances .Average(i => (i.FinishedAt!.Value - i.CreatedAt).TotalSeconds); Console.WriteLine($"\nDurchschnittliche Laufzeit: {avgDuration:F2} Sekunden"); }

Zeitbasierte Filter

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessInstancesClient(engineAddress); // Alle Instanzen abrufen var allInstances = await client.QueryAsync(query => { query.FilterByProcessModelId("OrderProcess"); }); // Im Code filtern nach Zeitstempel var now = DateTime.UtcNow; var last24Hours = now.AddHours(-24); var lastWeek = now.AddDays(-7); // Prozesse der letzten 24 Stunden var recent = allInstances .Where(i => i.CreatedAt >= last24Hours) .ToList(); Console.WriteLine($"Letzte 24 Stunden: {recent.Count}"); // Prozesse der letzten Woche var thisWeek = allInstances .Where(i => i.CreatedAt >= lastWeek) .ToList(); Console.WriteLine($"Letzte 7 Tage: {thisWeek.Count}"); // Laufen länger als 1 Stunde var longRunning = allInstances .Where(i => i.State == ProcessState.Running) .Where(i => (DateTime.UtcNow - i.CreatedAt).TotalHours > 1) .ToList(); Console.WriteLine($"Laufen länger als 1h: {longRunning.Count}");

Mit Authentifizierung

using ProcessCube.Engine; using ProcessCube.Engine.Client.Identity; // Identity Provider erstellen var identityProvider = new ClientCredentialsIdentityProvider( authorityAddress: "http://localhost:11235", clientId: "monitoring-service", clientSecret: "secret-key", scope: "engine_read" ); // Token abrufen var identity = await identityProvider.GetIdentityAsync(); // Client mit Identity erstellen var client = ClientFactory.CreateProcessInstancesClient( engineAddress: "http://localhost:8000", identity: identity ); // Prozesse abfragen (authentifiziert) var instances = await client.QueryAsync(query => { query.FilterByState(ProcessState.Running); }); Console.WriteLine($"Laufende Prozesse: {instances.Count}");

Dashboard-Daten sammeln

using ProcessCube.Engine; public class ProcessDashboard { private readonly IProcessInstancesClient _client; public ProcessDashboard(IProcessInstancesClient client) { _client = client; } public async Task<DashboardData> GetDashboardDataAsync(string processModelId) { var instances = await _client.QueryAsync(query => { query.FilterByProcessModelId(processModelId); }); var dashboard = new DashboardData { ProcessModelId = processModelId, TotalInstances = instances.Count, Running = instances.Count(i => i.State == ProcessState.Running), Suspended = instances.Count(i => i.State == ProcessState.Suspended), Finished = instances.Count(i => i.State == ProcessState.Finished), Error = instances.Count(i => i.State == ProcessState.Error), Terminated = instances.Count(i => i.State == ProcessState.Terminated) }; // Durchschnittliche Laufzeit var finishedInstances = instances .Where(i => i.FinishedAt.HasValue) .ToList(); if (finishedInstances.Any()) { dashboard.AverageDurationSeconds = finishedInstances .Average(i => (i.FinishedAt!.Value - i.CreatedAt).TotalSeconds); } return dashboard; } } public class DashboardData { public string ProcessModelId { get; set; } public int TotalInstances { get; set; } public int Running { get; set; } public int Suspended { get; set; } public int Finished { get; set; } public int Error { get; set; } public int Terminated { get; set; } public double AverageDurationSeconds { get; set; } }

Fehlerbehandlung

using ProcessCube.Engine; using ProcessCube.Engine.Client.Exceptions; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessInstancesClient(engineAddress); try { var instances = await client.QueryAsync(query => { query.FilterByProcessModelId("OrderProcess"); }); Console.WriteLine($"Gefunden: {instances.Count} Instanzen"); } catch (EngineClientException ex) when (ex.StatusCode == 401) { Console.WriteLine("Nicht authentifiziert"); } catch (EngineClientException ex) when (ex.StatusCode == 403) { Console.WriteLine("Fehlende Berechtigung"); } catch (HttpRequestException ex) { Console.WriteLine($"Verbindungsfehler: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"Unerwarteter Fehler: {ex.Message}"); }

Performance-Tipp: Wenn Sie nur den Status eines einzelnen Prozesses prüfen müssen, verwenden Sie FilterByProcessInstanceId() statt alle Instanzen abzufragen.

Nächste Schritte