This release introduces major enhancements to workflow orchestration, resiliency, and developer experience. It brings support for executing and awaiting nested workflows, improved serialization and variable handling, expanded SQL activity capabilities, and comprehensive OpenTelemetry integration. With improved join behavior, controlled commit states, and auto-resume of interrupted workflows, this version provides even greater robustness for long-running and distributed scenarios. Several optional modules have been extracted to streamline the core, and many APIs were enhanced for better extensibility. Numerous bug fixes and usability improvements round out this feature-packed release.
Highlights
Controlled Commit States
Gain precise control over workflow persistence. Workflows can now define when to persist their state—before, after, or both before and after executing an activity. Custom strategies are also supported, such as committing every N seconds, allowing for powerful tuning of reliability and performance characteristics.
Auto Resume Interrupted Workflows
Workflows interrupted due to e.g. pod shutdowns are now automatically resumed on application restart. Combined with Controlled Commit States, this ensures minimal re-execution and smooth recovery from failures, supporting highly reliable long-running workflows.
Resilient Activities
The SendHttpRequest activity now features built-in retry logic using Polly. A simple checkbox enables resilience for your HTTP calls, with a more advanced configuration UI coming in 3.5.0, allowing full control over retry strategies.
Improved Join Behavior
Flowchart activities now intelligently track which paths were activated. This enables more accurate joining behavior, especially when using WaitAll
in combination with dynamic branching via Switch or Decision activities. Advanced looping scenarios will be further enhanced in 3.6.0.
Trimming the Core
Several optional modules have been extracted to the elsa-extensions repository, helping streamline the core and reduce dependencies. These include:
- Telnyx
- OrchardCore
- SQL Activities
- Agents
- Azure Service Bus
What's Changed
- Add functionality to execute nested workflows by @sfmskywalker in #6137
- Fix/32953 by @raymonddenhaan in #6147
- Add output serialization and deserialization support by @sfmskywalker in #6152
- Add support for waiting for child workflows in ExecuteWorkflow by @sfmskywalker in #6226
- Added DeleteVariablesAsync method for the workflow context by @MariusVuscanNx in #6290
- Back-port PolymorphicObjectConverter from 3.3 by @sfmskywalker in #6353
- Exposed incidents in the Elsa.Api.Client by @MariusVuscanNx in #6377
- Exposed incidents in the Elsa.Api.Client by @MariusVuscanNx in #6375
- Updated deprecated artifact by @MariusVuscanNx in #6378
- Updated deprecated artifacts by @MariusVuscanNx in #6379
- Controlled Commit States Feature Implementation by @sfmskywalker in #6343
- Added Alterations API to Client API library and updated server API co… by @yinzara in #6370
- FEAT: Implements SQL Activities by @KnibbsyMan in #6257
- ISSUE: Resolves Directory.Packages.props - Prevents Building by @KnibbsyMan in #6386
- Add customizable tenant header support for HTTP routing by @sfmskywalker in #6395
- Add missing request properties when starting workflow by @sfmskywalker in #6394
- Removes Built In SQL Editor Configuration by @KnibbsyMan in #6393
- Implement bulk cancellation using alterations and filters by @sfmskywalker in #6392
- Add toggle for WorkflowInboxCleanupJob in WorkflowRuntimeFeature by @sfmskywalker in #6418
- Add AddManyAsync method to activity execution stores by @sfmskywalker in #6416
- Improve APIs for extensibility and replaceability by @sfmskywalker in #6420
- Add AddManyAsync method to activity execution stores by @sfmskywalker in #6415
- ActivityExecutionContext Children property not populated by @bobhauser in #6423
- Add IBusRegistrationContext to Transport Configuration Actions by @CODEdire in #6413
- Add CorrelationId to NewBookmarkQueueItem by @pkaaz in #6412
- Enable configurable toggle for workflow inbox cleanup job by @sfmskywalker in #6429
- Update flowchart activity scheduling, implicit join (and FlowJoin/WaitAll) now only waits for followed connections by @bobhauser in #6406
- FEAT : Connection/Secret provider/handler to define generic configuration for Activities by @jdevillard in #6291
- Remove Telnyx module from the codebase by @sfmskywalker in #6437
- Remove Elsa.OrchardCore module. by @sfmskywalker in #6438
- Refactor WebhooksFeature to streamline configuration. by @sfmskywalker in #6440
- Remove Azure Service Bus integration and related tests by @sfmskywalker in #6443
- Add Resiliency to HTTP Request Activity by @sfmskywalker in #6447
- Add OpenTelemetry error span handling infrastructure by @sfmskywalker in #6427
- Stop DefaultBookmarkQueuePurger log spamming by @bobhauser in #6452
- Add workflow restart functionality for handling interruptions by @sfmskywalker in #6435
- Remove Agents by @sfmskywalker in #6461
- Revise retry policy by @sfmskywalker in #6465
- Simplify HttpRequestException handling in retry logic. by @sfmskywalker in #6466
- Update retry configuration to retry up to 4 minutes by @raymonddenhaan in #6470
- Harmonized launchSettings to be inline with appSettings by @MatthijsKrempel in #6467
- Patch ObjectConverter by @sfmskywalker in #6474
- Add support for passing initial variables by @sfmskywalker in #6476
- Fix serialization of composite activities by @sfmskywalker in #6478
- Fixes issue with FlowJoin(WaitAny) where activities can be executed multiple times by @bobhauser in #6480
- Bug - Update Scripting Activities To Resolve Auto Complete Issues by @KnibbsyMan in #6481
- Merge blueberry into master by @MariusVuscanNx in #6483
- Added missing functionalities from main as part of the blueberry merge by @MariusVuscanNx in #6487
- Refactor variable merging logic in ActivityExecutionContext by @sfmskywalker in #6493
- DateTimePicker UI Hint Missing by @KnibbsyMan in #6494
- Improved support for named workflow instances by @sfmskywalker in #6460
- Enhancement - Additional SQL Activity Features by @KnibbsyMan in #6475
- Refactor variable initialization for clarity and consistency by @sfmskywalker in #6495
- #6400 Add ClearProvider again to ActivityRegistry by @truthz03 in #6497
- Correct the issue with DeleteAsync not executing due to a premature p… by @Green7 in #6491
- Refactor activity execution state handling with IDisposable by @sfmskywalker in #6501
- Allow to configure JobRunner worker count by @truthz03 in #6498
- FEAT - Automatic SQL Expression Parameterization by @KnibbsyMan in #6503
- Remove message retry configuration in DispatchWorkflowRequestConsumer by @sfmskywalker in #6506
- Improve OTEL Spans and Tags for Workflow and Activity Execution by @sfmskywalker in #6502
- Handle conversion of enumerables to arrays in ObjectConverter by @sfmskywalker in #6508
- Catch exceptions and log instead of crashing by @yinzara in #6477
- Update Dapper Migrations by @sfmskywalker in #6520
- Fix DbContext pooling by @sfmskywalker in #6531
- Add support for activity output testing by @sfmskywalker in #6529
- Add strict type checking for variable parsing by @sfmskywalker in #6536
- Fix race condition in Distributed Workflow Runtime during same-workflow event publishing by @sfmskywalker in #6538
- Fix Output Persistence of Async Activities by @sfmskywalker in #6542
- Moved compression to separate feature by @raymonddenhaan in #6554
- Enhanced Delete of variable persistence manager to allow drivers filt… by @MariusVuscanNx in #6558
- Fix TenantId Missing in ActivityExecutionRecords and DB Context Isolation in Multitenancy by @sfmskywalker in #6549
- Fix infinitely waiting Alterations Workflow by @sfmskywalker in #6561
- Extended the incidents data to include the activityNodeId by @MariusVuscanNx in #6570
- Fix MessageReceived not setting Result by @sfmskywalker in #6562
- Fix Container Type Evaluation by @sfmskywalker in #6584
- Fix Dispatch Workflow Resumption by @sfmskywalker in #6586
- Remove alteration models and refactor to use JsonObject by @sfmskywalker in #6582
- Refactor variable storage driver mapping logic. by @sfmskywalker in #6588
- Make input variable names case-insensitive in dictionary by @sfmskywalker in #6590
- Fixed Log Persistence Mode Evaluation For Activity Execution by @sfmskywalker in #6595
- Remove default commit strategy by @sfmskywalker in #6599
- Implement internal state activity persistence and logging mechanisms by @sfmskywalker in #6601
- Remove obsolete properties and refactor activity evaluation by @sfmskywalker in #6603
- Start a new workflow trace when triggered from UI by @raymonddenhaan in #6606
New Contributors
- @yinzara made their first contribution in #6370
- @CODEdire made their first contribution in #6413
- @pkaaz made their first contribution in #6412
- @MatthijsKrempel made their first contribution in #6467
- @truthz03 made their first contribution in #6497
Full Changelog: 3.3.5...3.4.0