Skip to Content

Prozess deployen

Mit dem ProcessDefinitionsClient können BPMN-Diagramme in die ProcessCube® Engine hochgeladen und deployed werden.

UploadProcessDefinitionAsync()

Deployed ein BPMN-Diagramm aus einem XML-String:

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessDefinitionsClient(engineAddress); // BPMN-XML aus Datei laden var bpmnXml = await File.ReadAllTextAsync("OrderProcess.bpmn"); // Prozess deployen await client.UploadProcessDefinitionAsync( bpmnXml, overwriteExisting: true ); Console.WriteLine("Prozess erfolgreich deployed");

Der Parameter overwriteExisting bestimmt, ob ein bereits existierender Prozess mit derselben ID überschrieben werden soll.

Parameter

ParameterTypBeschreibung
xmlstringBPMN 2.0 XML-Inhalt
overwriteExistingboolÜberschreibt existierenden Prozess (optional, default: false)

Einzelnen Prozess deployen

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessDefinitionsClient(engineAddress); try { // BPMN-Datei laden var bpmnPath = "processes/OrderProcess.bpmn"; var bpmnXml = await File.ReadAllTextAsync(bpmnPath); Console.WriteLine($"Deploying: {bpmnPath}"); // Deployen mit Überschreiben await client.UploadProcessDefinitionAsync( bpmnXml, overwriteExisting: true ); Console.WriteLine("✓ Prozess erfolgreich deployed"); } catch (FileNotFoundException) { Console.WriteLine("BPMN-Datei nicht gefunden"); } catch (Exception ex) { Console.WriteLine($"Deployment fehlgeschlagen: {ex.Message}"); }

Mehrere Prozesse deployen

using ProcessCube.Engine; using System.IO; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessDefinitionsClient(engineAddress); // Alle BPMN-Dateien in einem Verzeichnis finden var processDirectory = "processes"; var bpmnFiles = Directory.GetFiles(processDirectory, "*.bpmn"); Console.WriteLine($"Gefunden: {bpmnFiles.Length} BPMN-Dateien"); var successCount = 0; var failCount = 0; foreach (var bpmnFile in bpmnFiles) { try { var bpmnXml = await File.ReadAllTextAsync(bpmnFile); var fileName = Path.GetFileName(bpmnFile); Console.WriteLine($"Deploying: {fileName}..."); await client.UploadProcessDefinitionAsync( bpmnXml, overwriteExisting: true ); Console.WriteLine($" ✓ {fileName} deployed"); successCount++; } catch (Exception ex) { Console.WriteLine($" ✗ {Path.GetFileName(bpmnFile)}: {ex.Message}"); failCount++; } } Console.WriteLine(); Console.WriteLine($"Deployment abgeschlossen:"); Console.WriteLine($" Erfolgreich: {successCount}"); Console.WriteLine($" Fehlgeschlagen: {failCount}");

BPMN-XML direkt erstellen

Für einfache Prozesse kann das BPMN-XML auch direkt im Code erstellt werden:

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessDefinitionsClient(engineAddress); // Einfaches BPMN-XML var bpmnXml = @"<?xml version=""1.0"" encoding=""UTF-8""?> <bpmn:definitions xmlns:bpmn=""http://www.omg.org/spec/BPMN/20100524/MODEL"" xmlns:bpmndi=""http://www.omg.org/spec/BPMN/20100524/DI"" xmlns:dc=""http://www.omg.org/spec/DD/20100524/DC"" id=""Definitions_1"" targetNamespace=""http://processcube.io/schema/1.0""> <bpmn:process id=""SimpleProcess"" name=""Simple Process"" isExecutable=""true""> <bpmn:startEvent id=""StartEvent_1"" name=""Start""> <bpmn:outgoing>Flow_1</bpmn:outgoing> </bpmn:startEvent> <bpmn:endEvent id=""EndEvent_1"" name=""End""> <bpmn:incoming>Flow_1</bpmn:incoming> </bpmn:endEvent> <bpmn:sequenceFlow id=""Flow_1"" sourceRef=""StartEvent_1"" targetRef=""EndEvent_1"" /> </bpmn:process> </bpmn:definitions>"; // Deployen await client.UploadProcessDefinitionAsync(bpmnXml, overwriteExisting: true); Console.WriteLine("SimpleProcess deployed");

Für komplexe Prozesse sollten Sie einen BPMN-Editor wie das ProcessCube® Studio verwenden, anstatt BPMN-XML manuell zu erstellen.

Deploy und sofort starten

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessDefinitionsClient(engineAddress); // 1. BPMN laden und deployen var bpmnXml = await File.ReadAllTextAsync("PaymentProcess.bpmn"); await client.UploadProcessDefinitionAsync( bpmnXml, overwriteExisting: true ); Console.WriteLine("Prozess deployed"); // 2. Direkt nach dem Deployment starten var payload = new PaymentPayload( PaymentId: "PAY-789", Amount: 250.00m, Currency: "EUR" ); var response = await client.StartProcessInstanceAsync( processModelId: "PaymentProcess", startEventId: "StartEvent_1", initialToken: payload ); Console.WriteLine($"Prozess gestartet: {response.ProcessInstanceId}"); // Payload-Definition internal sealed record PaymentPayload( string PaymentId, decimal Amount, string Currency );

Deployment validieren

Prüfen Sie nach dem Deployment, ob der Prozess verfügbar ist:

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessDefinitionsClient(engineAddress); var processModelId = "OrderProcess"; // 1. BPMN laden und deployen var bpmnXml = await File.ReadAllTextAsync($"{processModelId}.bpmn"); await client.UploadProcessDefinitionAsync( bpmnXml, overwriteExisting: true ); Console.WriteLine($"{processModelId} deployed"); // 2. Validierung - Prozess in Liste suchen var processes = await client.GetProcessModelsAsync(); var deployedProcess = processes.FirstOrDefault(p => p.Id == processModelId); if (deployedProcess != null) { Console.WriteLine($"✓ Deployment validiert"); Console.WriteLine($" Name: {deployedProcess.Name}"); Console.WriteLine($" Version: {deployedProcess.Version}"); Console.WriteLine($" Start-Events: {deployedProcess.StartEvents.Count}"); } else { Console.WriteLine($"✗ Prozess '{processModelId}' nicht in Engine gefunden"); }

Mit Authentifizierung

Wenn die Engine mit Authority gesichert ist:

using ProcessCube.Engine; using ProcessCube.Engine.Client.Identity; // Identity Provider erstellen var identityProvider = new ClientCredentialsIdentityProvider( authorityAddress: "http://localhost:11235", clientId: "deployment-service", clientSecret: "secret-key", scope: "engine_write" ); // Token abrufen var identity = await identityProvider.GetIdentityAsync(); // Client mit Identity erstellen var client = ClientFactory.CreateProcessDefinitionsClient( engineAddress: "http://localhost:8000", identity: identity ); // BPMN laden und deployen (authentifiziert) var bpmnXml = await File.ReadAllTextAsync("OrderProcess.bpmn"); await client.UploadProcessDefinitionAsync( bpmnXml, overwriteExisting: true ); Console.WriteLine("Authenticated deployment successful");

Für Deployments benötigen Sie den Scope engine_write in Ihrem Access Token.

Deployment-Pipeline

Beispiel für eine automatisierte Deployment-Pipeline:

using ProcessCube.Engine; using ProcessCube.Engine.Client.Identity; public class ProcessDeploymentService { private readonly IProcessDefinitionsClient _client; public ProcessDeploymentService(string engineAddress, string authorityAddress) { // Mit Authentifizierung var identityProvider = new ClientCredentialsIdentityProvider( authorityAddress: authorityAddress, clientId: Environment.GetEnvironmentVariable("PROCESSCUBE_CLIENT_ID"), clientSecret: Environment.GetEnvironmentVariable("PROCESSCUBE_CLIENT_SECRET"), scope: "engine_write engine_read" ); var identity = identityProvider.GetIdentityAsync().Result; _client = ClientFactory.CreateProcessDefinitionsClient( engineAddress, identity ); } public async Task<DeploymentResult> DeployProcessAsync( string bpmnFilePath, bool overwrite = true) { var result = new DeploymentResult { FileName = Path.GetFileName(bpmnFilePath), StartTime = DateTime.UtcNow }; try { // BPMN laden var bpmnXml = await File.ReadAllTextAsync(bpmnFilePath); // Deployen await _client.UploadProcessDefinitionAsync( bpmnXml, overwriteExisting: overwrite ); // Validieren var processes = await _client.GetProcessModelsAsync(); var deployed = processes.FirstOrDefault(p => p.Xml.Contains(bpmnXml.Substring(0, 100)) ); result.Success = deployed != null; result.ProcessModelId = deployed?.Id; result.Version = deployed?.Version; } catch (Exception ex) { result.Success = false; result.ErrorMessage = ex.Message; } finally { result.EndTime = DateTime.UtcNow; result.Duration = result.EndTime - result.StartTime; } return result; } public async Task<List<DeploymentResult>> DeployDirectoryAsync( string directoryPath) { var results = new List<DeploymentResult>(); var bpmnFiles = Directory.GetFiles(directoryPath, "*.bpmn"); foreach (var bpmnFile in bpmnFiles) { var result = await DeployProcessAsync(bpmnFile); results.Add(result); var status = result.Success ? "✓" : "✗"; Console.WriteLine($"{status} {result.FileName} ({result.Duration.TotalSeconds:F2}s)"); if (!result.Success) { Console.WriteLine($" Error: {result.ErrorMessage}"); } } return results; } } public class DeploymentResult { public string FileName { get; set; } public bool Success { get; set; } public string? ProcessModelId { get; set; } public string? Version { get; set; } public string? ErrorMessage { get; set; } public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } public TimeSpan Duration { get; set; } } // Verwendung var service = new ProcessDeploymentService( "http://localhost:8000", "http://localhost:11235" ); var results = await service.DeployDirectoryAsync("./processes"); Console.WriteLine($"\nDeployment Summary:"); Console.WriteLine($" Success: {results.Count(r => r.Success)}"); Console.WriteLine($" Failed: {results.Count(r => !r.Success)}");

Fehlerbehandlung

using ProcessCube.Engine; using ProcessCube.Engine.Client.Exceptions; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateProcessDefinitionsClient(engineAddress); try { var bpmnXml = await File.ReadAllTextAsync("OrderProcess.bpmn"); await client.UploadProcessDefinitionAsync( bpmnXml, overwriteExisting: true ); Console.WriteLine("Deployment erfolgreich"); } catch (EngineClientException ex) when (ex.StatusCode == 400) { Console.WriteLine("Ungültiges BPMN-XML"); Console.WriteLine($"Details: {ex.Message}"); } catch (EngineClientException ex) when (ex.StatusCode == 401) { Console.WriteLine("Nicht authentifiziert"); } catch (EngineClientException ex) when (ex.StatusCode == 403) { Console.WriteLine("Fehlende Berechtigung für Deployment"); } catch (EngineClientException ex) when (ex.StatusCode == 409) { Console.WriteLine("Prozess existiert bereits (overwriteExisting: false)"); } catch (FileNotFoundException ex) { Console.WriteLine($"BPMN-Datei nicht gefunden: {ex.FileName}"); } catch (HttpRequestException ex) { Console.WriteLine($"Verbindungsfehler: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"Unerwarteter Fehler: {ex.Message}"); }

Best Practice: Validieren Sie BPMN-XML vor dem Deployment mit einem XML-Schema-Validator, um Fehler frühzeitig zu erkennen.

Nächste Schritte