Skip to content

Commit 2332a20

Browse files
committed
fix: allowed to strip the workflow manifest from hangfire serialization
1 parent 52cfb7f commit 2332a20

6 files changed

Lines changed: 58 additions & 8 deletions

File tree

src/WorkflowEngine.Core/IWorkflow.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ public interface IWorkflow // Documentet
66
{
77
public Guid Id { get; }
88
public string Version { get; }
9-
public WorkflowManifest Manifest { get; }
9+
public WorkflowManifest Manifest { get; set; }
10+
11+
12+
13+
1014

1115
}
1216

src/WorkflowEngine.Core/TriggerContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public string ToString(string format, IFormatProvider formatProvider)
1818
return $"{Workflow?.GetType().Name} workflow={Workflow?.Id} version={Workflow?.Version} trigger={Trigger?.Key}";
1919
}
2020

21-
if (format == "Id")
21+
if (format == "Id" && RunId != Guid.Empty)
2222
return RunId.ToString();
2323

2424
return string.Empty;

src/WorkflowEngine.Core/Workflow.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ public class Workflow : IWorkflow, IFormattable
88
public Guid Id { get; set; }
99
public string Version { get; set; }
1010
public WorkflowManifest Manifest { get; set; }
11-
11+
12+
1213
public string ToString(string format, IFormatProvider formatProvider)
1314
{
1415
if (format == "Id")

src/WorkflowEngine.Hangfire/DependencyInjectionExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public static IServiceCollection AddWorkflowEngine<TOutputsRepository>(this ISer
2929

3030
services.AddHostedService<WorkflowStarterBackgroundJob>();
3131

32+
services.AddTransient<IWorkflowAccessor, DefaultWorkflowAccessor>();
3233
return services;
3334
}
3435

src/WorkflowEngine.Hangfire/HangfireWorkflowExecutor.cs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using Hangfire;
22
using Hangfire.Server;
33
using System;
4+
using System.Collections;
5+
using System.Collections.Generic;
6+
using System.Linq;
47
using System.Threading.Tasks;
58
using WorkflowEngine.Core;
69
using WorkflowEngine.Core.Actions;
@@ -9,18 +12,37 @@
912

1013
namespace WorkflowEngine
1114
{
12-
15+
16+
public interface IWorkflowAccessor
17+
{
18+
ValueTask<WorkflowManifest> GetWorkflowManifestAsync(IWorkflow workflow);
19+
}
20+
public class DefaultWorkflowAccessor : IWorkflowAccessor
21+
{
22+
private readonly IEnumerable<IWorkflow> workflows;
23+
24+
public DefaultWorkflowAccessor(IEnumerable<IWorkflow> workflows)
25+
{
26+
this.workflows = workflows ?? throw new ArgumentNullException(nameof(workflows));
27+
}
28+
public ValueTask<WorkflowManifest> GetWorkflowManifestAsync(IWorkflow workflow)
29+
{
30+
return new ValueTask<WorkflowManifest>(workflows.FirstOrDefault(x=>x.Id == workflow.Id && workflow.Version == x.Version).Manifest);
31+
}
32+
}
1333
public class HangfireWorkflowExecutor : IHangfireWorkflowExecutor, IHangfireActionExecutor
1434
{
35+
private readonly IWorkflowAccessor workflowAccessor;
1536
private readonly IBackgroundJobClient backgroundJobClient;
1637
private readonly IRunContextAccessor runContextAccessor;
1738
private readonly IWorkflowExecutor executor;
1839
private readonly IActionExecutor actionExecutor;
1940
private readonly IOutputsRepository outputRepository;
2041
private readonly IArrayContext arrayContext;
2142

22-
public HangfireWorkflowExecutor(IBackgroundJobClient backgroundJobClient, IArrayContext arrayContext, IRunContextAccessor runContextAccessor, IWorkflowExecutor executor, IActionExecutor actionExecutor, IOutputsRepository actionResultRepository)
43+
public HangfireWorkflowExecutor(IWorkflowAccessor workflowAccessor, IBackgroundJobClient backgroundJobClient, IArrayContext arrayContext, IRunContextAccessor runContextAccessor, IWorkflowExecutor executor, IActionExecutor actionExecutor, IOutputsRepository actionResultRepository)
2344
{
45+
this.workflowAccessor = workflowAccessor ?? throw new ArgumentNullException(nameof(workflowAccessor));
2446
this.backgroundJobClient=backgroundJobClient??throw new ArgumentNullException(nameof(backgroundJobClient));
2547
this.arrayContext=arrayContext??throw new ArgumentNullException(nameof(arrayContext));
2648
this.runContextAccessor=runContextAccessor;
@@ -38,10 +60,15 @@ public HangfireWorkflowExecutor(IBackgroundJobClient backgroundJobClient, IArray
3860

3961
public async ValueTask<object> ExecuteAsync(IRunContext run, IWorkflow workflow, IAction action, PerformContext context)
4062
{
63+
//TODO - avoid sending all workflow over hangfire, so we should lookup the manifest here if not set on workflow form its ID.
64+
workflow.Manifest ??= await workflowAccessor.GetWorkflowManifestAsync(workflow);
65+
66+
4167
runContextAccessor.RunContext = run;
4268
arrayContext.JobId=context.BackgroundJob.Id;
4369

4470

71+
4572
var result = await actionExecutor.ExecuteAsync(run, workflow, action);
4673

4774

@@ -76,14 +103,19 @@ public async ValueTask<object> ExecuteAsync(IRunContext run, IWorkflow workflow,
76103
/// <returns></returns>
77104
public async ValueTask<object> TriggerAsync(ITriggerContext context)
78105
{
79-
106+
//TODO - avoid sending all workflow over hangfire,
107+
context.Workflow.Manifest ??= await workflowAccessor.GetWorkflowManifestAsync(context.Workflow);
108+
80109
context.RunId = context.RunId == Guid.Empty? Guid.NewGuid() : context.RunId;
81110

82111
runContextAccessor.RunContext = context;
83112
var action = await executor.Trigger(context);
84113

85114
if (action != null)
86115
{
116+
//TODO - avoid sending all workflow over hangfire, so we should wipe the workflow.manifest before scheduling and restore it after.
117+
context.Workflow.Manifest = null;
118+
87119

88120
var a = backgroundJobClient.Enqueue<IHangfireActionExecutor>(
89121
(executor) => executor.ExecuteAsync(context, context.Workflow, action,null));

src/WorkflowEngine.Hangfire/ScheduledWorkflowTrigger.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,22 @@ public Task<string> Trigger(string externalid, bool create, DateTimeOffset time,
4040
if (create)
4141
{
4242
var workflow = new TWorkflow();
43-
workflow.Manifest.Triggers.First().Value.Inputs = inputs;
43+
var trigger = new Trigger
44+
{
45+
Inputs = inputs,
46+
ScheduledTime = DateTimeOffset.UtcNow,
47+
Type = workflow.Manifest.Triggers.FirstOrDefault().Value.Type,
48+
Key = workflow.Manifest.Triggers.FirstOrDefault().Key
49+
};
50+
51+
52+
53+
//TODO - avoid sending all workflow over hangfire,
54+
workflow.Manifest = null;
4455

4556
var job = _backgroundJobClient.Schedule<IHangfireWorkflowExecutor>((executor) => executor.TriggerAsync(
46-
new TriggerContext { Workflow = workflow, }), time);
57+
new TriggerContext { Workflow = workflow, Trigger = trigger ,
58+
}), time);
4759

4860
_logger.LogInformation("Created scheduled workflow job {JobID}", job);
4961

0 commit comments

Comments
 (0)