Skip to content

merge from upstream #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 58 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
ecd3d73
order of compensation steps
danielgerlag Oct 16, 2018
4378cca
Merge pull request #192 from danielgerlag/issue-191
danielgerlag Oct 21, 2018
fd3305c
README.md url fix
wswind Nov 15, 2018
7ff88bd
Merge pull request #203 from wswind/master
danielgerlag Nov 19, 2018
8d37bcd
AWS Simple Queue Service (#207)
danielgerlag Dec 9, 2018
5a7f7bb
Add MySQL Persistence Provider
erolkskn Dec 10, 2018
78eb877
Codacy Quality Review Commit
erolkskn Dec 10, 2018
18a7642
Fixed problem were GetDefinition without version would throw if now w…
dr-BEat Dec 11, 2018
4bfba49
Added environments to MemoryPersistanceProvider for parallel testing
dr-BEat Dec 11, 2018
7d10016
Updated FakeItEasy to avoid problems with new versions of .NetCore
dr-BEat Dec 14, 2018
f68d049
Fixed bug with Converter.ChangeType being called on object type
dr-BEat Dec 14, 2018
f455477
Added Unittests for WorkflowRegistry
dr-BEat Dec 15, 2018
addcc50
Merge pull request #210 from erolkskn/mysql-provider
danielgerlag Dec 16, 2018
70d2a6a
Merge pull request #211 from dr-BEat/feat/RegistryChecks
danielgerlag Dec 16, 2018
7a9c35c
Merge pull request #214 from dr-BEat/bug/ProcessOutputs
danielgerlag Dec 16, 2018
9cf5181
Merge pull request #212 from dr-BEat/feat/MemoryPersistanceEnvironments
danielgerlag Dec 16, 2018
6908b00
Increment EF Core version to 2.1.0 from 2.0.0
erolkskn Dec 27, 2018
4d3eca0
Add Migrations to MySQL Persistence Provider.
erolkskn Dec 29, 2018
0f2f938
Removed PackageTargetFallback from old NET Core 1.1 projects
erolkskn Dec 29, 2018
156d5bf
Workflow life cycle events (#215)
danielgerlag Dec 30, 2018
a15499e
Update version number of packages.
erolkskn Dec 31, 2018
3b6ff05
DynamoDB based lock manager
danielgerlag Dec 31, 2018
7594dbe
config, docs
danielgerlag Dec 31, 2018
3a2f5a7
Merge pull request #221 from danielgerlag/dynamo-locks
danielgerlag Dec 31, 2018
ce037c0
Use BlockingCollection for LifeCycleEventPublisher
Kahbazi Dec 31, 2018
18bfbe5
Fixed typo WorkflowInsanceId => WorkflowInstanceId
Dec 31, 2018
a66f09a
Merge pull request #223 from kpko/master
danielgerlag Dec 31, 2018
3717923
Update WorkflowCore.csproj
danielgerlag Dec 31, 2018
238e766
Merge pull request #222 from Kahbazi/LifeCycleEventPublisher
danielgerlag Dec 31, 2018
1f21b41
move try/catch down
danielgerlag Dec 31, 2018
6c10082
Merge branch 'master' into efcore-ver-increment-mysql-migrations
danielgerlag Dec 31, 2018
6b7ac54
Merge pull request #220 from erolkskn/efcore-ver-increment-mysql-migr…
danielgerlag Dec 31, 2018
0ac2eed
Amazon DynamoDB persistence provider (#227)
danielgerlag Jan 6, 2019
b09e07e
Workflow Core v1.7 (#237)
danielgerlag Jan 13, 2019
bda699a
Update README.md
danielgerlag Jan 15, 2019
46ea0a8
Update README.md
erolkskn Jan 16, 2019
d46399a
Input / Output (#245)
danielgerlag Jan 19, 2019
8a6d1ff
Search Index API & Elasticsearch support (#243)
danielgerlag Jan 19, 2019
3d441f7
release notes
danielgerlag Jan 19, 2019
4580fce
release notes
danielgerlag Jan 19, 2019
e56e805
AWS Kinesis provider for event hubs (#246)
danielgerlag Jan 20, 2019
fe98040
web sample
danielgerlag Jan 23, 2019
16c3e0f
Enhanced to allow scoped dependecies to be injected into steps
MarioAndron Jan 23, 2019
b25f3f0
Fixed unit tests by adding a scope provider
MarioAndron Jan 23, 2019
63d0f5a
wip
danielgerlag Jan 23, 2019
9397958
bump version
danielgerlag Jan 24, 2019
cd3cb13
Merge branch 'kinesis2'
danielgerlag Jan 24, 2019
3b10a3e
Merge pull request #241 from erolkskn/readme-fix
danielgerlag Jan 25, 2019
6ba5b71
Update README.md
danielgerlag Jan 25, 2019
7dea069
Redis persistence provider (#253)
danielgerlag Jan 27, 2019
b6b14c5
Update README.md
danielgerlag Jan 27, 2019
a50bb6a
Update README.md
danielgerlag Jan 27, 2019
a1e7f3a
Update README.md
danielgerlag Jan 27, 2019
e432405
readme
danielgerlag Jan 31, 2019
8bcd493
Added intetgration scenarios to test IoC scope for MS IoC container …
MarioAndron Feb 1, 2019
8df0cee
appease the codacy gods
MarioAndron Feb 1, 2019
e183903
Merge pull request #250 from MarioAndron/master
danielgerlag Feb 2, 2019
0bc1631
bump version
danielgerlag Feb 3, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Workflow life cycle events (danielgerlag#215)
  • Loading branch information
danielgerlag authored Dec 30, 2018
commit 156d5bfc6a24a5b725e3b11f2a730f8964e3b207
5 changes: 5 additions & 0 deletions ReleaseNotes/1.6.9.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Workflow Core 1.6.9

This release adds functionality to subscribe to workflow life cycle events (WorkflowStarted, WorkflowComplete, WorkflowError, WorkflowSuspended, WorkflowResumed, StepStarted, StepCompleted, etc...)
This can be achieved by either grabbing the `ILifeCycleEventHub` implementation from the IoC container and subscribing to events there, or attach an event on the workflow host class `IWorkflowHost.OnLifeCycleEvent`.
This implementation only publishes events to the local node... we will still need to implement a distributed version of the EventHub to solve the problem for multi-node clusters.
1 change: 1 addition & 0 deletions WorkflowCore.sln
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReleaseNotes", "ReleaseNote
ReleaseNotes\1.6.0.md = ReleaseNotes\1.6.0.md
ReleaseNotes\1.6.6.md = ReleaseNotes\1.6.6.md
ReleaseNotes\1.6.8.md = ReleaseNotes\1.6.8.md
ReleaseNotes\1.6.9.md = ReleaseNotes\1.6.9.md
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkflowCore.Sample14", "src\samples\WorkflowCore.Sample14\WorkflowCore.Sample14.csproj", "{6BC66637-B42A-4334-ADFB-DBEC9F29D293}"
Expand Down
2 changes: 1 addition & 1 deletion src/WorkflowCore/Interface/IExecutionResultProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace WorkflowCore.Interface
{
public interface IExecutionResultProcessor
{
void HandleStepException(WorkflowInstance workflow, WorkflowDefinition def, ExecutionPointer pointer, WorkflowStep step);
void HandleStepException(WorkflowInstance workflow, WorkflowDefinition def, ExecutionPointer pointer, WorkflowStep step, Exception exception);
void ProcessExecutionResult(WorkflowInstance workflow, WorkflowDefinition def, ExecutionPointer pointer, WorkflowStep step, ExecutionResult result, WorkflowExecutorResult workflowResult);
}
}
14 changes: 14 additions & 0 deletions src/WorkflowCore/Interface/ILifeCycleEventHub.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using WorkflowCore.Models.LifeCycleEvents;

namespace WorkflowCore.Interface
{
public interface ILifeCycleEventHub
{
Task PublishNotification(LifeCycleEvent evt);
void Subscribe(Action<LifeCycleEvent> action);
}
}
12 changes: 12 additions & 0 deletions src/WorkflowCore/Interface/ILifeCycleEventPublisher.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Text;
using WorkflowCore.Models.LifeCycleEvents;

namespace WorkflowCore.Interface
{
public interface ILifeCycleEventPublisher : IBackgroundTask
{
void PublishNotification(LifeCycleEvent evt);
}
}
13 changes: 13 additions & 0 deletions src/WorkflowCore/Interface/IWorkflowErrorHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
using WorkflowCore.Models;

namespace WorkflowCore.Interface
{
public interface IWorkflowErrorHandler
{
WorkflowErrorHandling Type { get; }
void Handle(WorkflowInstance workflow, WorkflowDefinition def, ExecutionPointer pointer, WorkflowStep step, Exception exception, Queue<ExecutionPointer> bubbleUpQueue);
}
}
5 changes: 4 additions & 1 deletion src/WorkflowCore/Interface/IWorkflowHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System;
using System.Threading.Tasks;
using WorkflowCore.Models;
using WorkflowCore.Models.LifeCycleEvents;

namespace WorkflowCore.Interface
{
Expand All @@ -19,6 +20,7 @@ public interface IWorkflowHost : IWorkflowController


event StepErrorEventHandler OnStepError;
event LifeCycleEventHandler OnLifeCycleEvent;
void ReportStepError(WorkflowInstance workflow, WorkflowStep step, Exception exception);

//public dependencies to allow for extension method access
Expand All @@ -32,4 +34,5 @@ public interface IWorkflowHost : IWorkflowController
}

public delegate void StepErrorEventHandler(WorkflowInstance workflow, WorkflowStep step, Exception exception);
}
public delegate void LifeCycleEventHandler(LifeCycleEvent evt);
}
19 changes: 19 additions & 0 deletions src/WorkflowCore/Models/LifeCycleEvents/LifeCycleEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace WorkflowCore.Models.LifeCycleEvents
{
public abstract class LifeCycleEvent
{
public DateTime EventTimeUtc { get; set; }

public string WorkflowInsanceId { get; set; }

public string WorkflowDefinitionId { get; set; }

public int Version { get; set; }

public string Reference { get; set; }
}
}
13 changes: 13 additions & 0 deletions src/WorkflowCore/Models/LifeCycleEvents/StepCompleted.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace WorkflowCore.Models.LifeCycleEvents
{
public class StepCompleted : LifeCycleEvent
{
public string ExecutionPointerId { get; set; }

public int StepId { get; set; }
}
}
13 changes: 13 additions & 0 deletions src/WorkflowCore/Models/LifeCycleEvents/StepStarted.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace WorkflowCore.Models.LifeCycleEvents
{
public class StepStarted : LifeCycleEvent
{
public string ExecutionPointerId { get; set; }

public int StepId { get; set; }
}
}
10 changes: 10 additions & 0 deletions src/WorkflowCore/Models/LifeCycleEvents/WorkflowCompleted.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace WorkflowCore.Models.LifeCycleEvents
{
public class WorkflowCompleted : LifeCycleEvent
{
}
}
15 changes: 15 additions & 0 deletions src/WorkflowCore/Models/LifeCycleEvents/WorkflowError.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace WorkflowCore.Models.LifeCycleEvents
{
public class WorkflowError : LifeCycleEvent
{
public string Message { get; set; }

public string ExecutionPointerId { get; set; }

public int StepId { get; set; }
}
}
10 changes: 10 additions & 0 deletions src/WorkflowCore/Models/LifeCycleEvents/WorkflowResumed.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace WorkflowCore.Models.LifeCycleEvents
{
public class WorkflowResumed : LifeCycleEvent
{
}
}
10 changes: 10 additions & 0 deletions src/WorkflowCore/Models/LifeCycleEvents/WorkflowStarted.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace WorkflowCore.Models.LifeCycleEvents
{
public class WorkflowStarted : LifeCycleEvent
{
}
}
10 changes: 10 additions & 0 deletions src/WorkflowCore/Models/LifeCycleEvents/WorkflowSuspended.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace WorkflowCore.Models.LifeCycleEvents
{
public class WorkflowSuspended : LifeCycleEvent
{
}
}
10 changes: 10 additions & 0 deletions src/WorkflowCore/Models/LifeCycleEvents/WorkflowTerminated.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace WorkflowCore.Models.LifeCycleEvents
{
public class WorkflowTerminated : LifeCycleEvent
{
}
}
8 changes: 8 additions & 0 deletions src/WorkflowCore/Models/WorkflowOptions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using Microsoft.Extensions.Logging;
using WorkflowCore.Interface;
using WorkflowCore.Services;

Expand All @@ -10,6 +11,7 @@ public class WorkflowOptions
internal Func<IServiceProvider, IPersistenceProvider> PersistanceFactory;
internal Func<IServiceProvider, IQueueProvider> QueueFactory;
internal Func<IServiceProvider, IDistributedLockProvider> LockFactory;
internal Func<IServiceProvider, ILifeCycleEventHub> EventHubFactory;
internal TimeSpan PollInterval;
internal TimeSpan IdleTime;
internal TimeSpan ErrorRetryInterval;
Expand All @@ -26,6 +28,7 @@ public WorkflowOptions(IServiceCollection services)
QueueFactory = new Func<IServiceProvider, IQueueProvider>(sp => new SingleNodeQueueProvider());
LockFactory = new Func<IServiceProvider, IDistributedLockProvider>(sp => new SingleNodeLockProvider());
PersistanceFactory = new Func<IServiceProvider, IPersistenceProvider>(sp => new MemoryPersistenceProvider());
EventHubFactory = new Func<IServiceProvider, ILifeCycleEventHub>(sp => new SingleNodeEventHub(sp.GetService<ILoggerFactory>()));
}

public void UsePersistence(Func<IServiceProvider, IPersistenceProvider> factory)
Expand All @@ -43,6 +46,11 @@ public void UseQueueProvider(Func<IServiceProvider, IQueueProvider> factory)
QueueFactory = factory;
}

public void UseEventHub(Func<IServiceProvider, ILifeCycleEventHub> factory)
{
EventHubFactory = factory;
}

public void UsePollInterval(TimeSpan interval)
{
PollInterval = interval;
Expand Down
9 changes: 9 additions & 0 deletions src/WorkflowCore/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using WorkflowCore.Primitives;
using WorkflowCore.Services.BackgroundTasks;
using WorkflowCore.Services.DefinitionStorage;
using WorkflowCore.Services.ErrorHandlers;

namespace Microsoft.Extensions.DependencyInjection
{
Expand All @@ -26,12 +27,20 @@ public static IServiceCollection AddWorkflow(this IServiceCollection services, A
services.AddTransient<IPersistenceProvider>(options.PersistanceFactory);
services.AddSingleton<IQueueProvider>(options.QueueFactory);
services.AddSingleton<IDistributedLockProvider>(options.LockFactory);
services.AddSingleton<ILifeCycleEventHub>(options.EventHubFactory);
services.AddSingleton<IWorkflowRegistry, WorkflowRegistry>();
services.AddSingleton<WorkflowOptions>(options);
services.AddSingleton<ILifeCycleEventPublisher, LifeCycleEventPublisher>();

services.AddTransient<IBackgroundTask, WorkflowConsumer>();
services.AddTransient<IBackgroundTask, EventConsumer>();
services.AddTransient<IBackgroundTask, RunnablePoller>();
services.AddTransient<IBackgroundTask>(sp => sp.GetService<ILifeCycleEventPublisher>());

services.AddTransient<IWorkflowErrorHandler, CompensateHandler>();
services.AddTransient<IWorkflowErrorHandler, RetryHandler>();
services.AddTransient<IWorkflowErrorHandler, TerminateHandler>();
services.AddTransient<IWorkflowErrorHandler, SuspendHandler>();

services.AddSingleton<IWorkflowController, WorkflowController>();
services.AddSingleton<IWorkflowHost, WorkflowHost>();
Expand Down
45 changes: 45 additions & 0 deletions src/WorkflowCore/Services/DefaultProviders/SingleNodeEventHub.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using WorkflowCore.Interface;
using WorkflowCore.Models.LifeCycleEvents;

namespace WorkflowCore.Services
{
public class SingleNodeEventHub : ILifeCycleEventHub
{
private ICollection<Action<LifeCycleEvent>> _subscribers = new HashSet<Action<LifeCycleEvent>>();
private readonly ILogger _logger;

public SingleNodeEventHub(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<SingleNodeEventHub>();
}

public Task PublishNotification(LifeCycleEvent evt)
{
Task.Run(() =>
{
foreach (var subscriber in _subscribers)
{
try
{
subscriber(evt);
}
catch (Exception ex)
{
_logger.LogWarning(default(EventId), ex, $"Error on event subscriber: {ex.Message}");
}
}
});
return Task.CompletedTask;
}

public void Subscribe(Action<LifeCycleEvent> action)
{
_subscribers.Add(action);
}
}
}
Loading