Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
098e1a6
Implement initial version of invoker mechanism
boma96 Jun 19, 2025
b4d34ec
...
boma96 Jun 20, 2025
1be8f42
Migrate serilaziation/deserialization to invoker service
boma96 Jun 24, 2025
412c15f
Remove IRequest references from code
boma96 Jun 24, 2025
9ba5c7d
Remove MediatR package
boma96 Jun 24, 2025
98fcf8c
Fix issue with retrieving type interfaces
boma96 Jun 25, 2025
8da6d4a
Remove assemblies parameter
boma96 Jun 25, 2025
f3ee402
Remove references to MediatR behaviors
boma96 Jun 28, 2025
5f49b6f
Remove stopwatch
boma96 Jun 28, 2025
267a759
Specify proper outputData
boma96 Jul 2, 2025
db8c82c
Replace RequestResponseLoggingBehavior with built in implementation
boma96 Jul 2, 2025
a300e17
Remove unused interface
boma96 Jul 2, 2025
7b29cda
Remove ContextLoggingMiddleware, inject context by default
boma96 Jul 2, 2025
98e1433
Make next delegate parameterless
boma96 Jul 2, 2025
5fda645
Rename worker interfaces and classes
boma96 Jul 2, 2025
efa3b2a
Remove unnecessary constraint
boma96 Jul 2, 2025
a6a4244
Delete empty file
boma96 Jul 2, 2025
ff4de6c
Fix worker
boma96 Jul 3, 2025
d3de05e
Fix base urls
boma96 Jul 3, 2025
46d9388
Fix namespace typo
boma96 Jul 3, 2025
347357d
Add initial setup for TestContainers
boma96 Jul 3, 2025
0099a01
Do not inject WorkerExecutionContext
boma96 Jul 3, 2025
f1e9fd9
Implement integration test
boma96 Jul 3, 2025
c08eb3c
Change wait strategy
boma96 Jul 3, 2025
de41f8d
Rename test case
boma96 Jul 3, 2025
710ef95
Replace IRequest with ITaskInput
boma96 Jul 4, 2025
4280998
Add worker invoker service tests
boma96 Jul 4, 2025
e7bcf7b
Update test workflow
boma96 Jul 4, 2025
927c7db
Add arg check
boma96 Jul 4, 2025
afea316
Rename handlers to workers
boma96 Jul 4, 2025
254254d
Remove unused fixture
boma96 Jul 4, 2025
ba548fe
Remove unused class
boma96 Jul 4, 2025
3879e30
Make classes internal
boma96 Jul 4, 2025
4be36bf
Copy context
boma96 Jul 4, 2025
3ebe79e
Delete unused embedded files
boma96 Jul 4, 2025
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
2 changes: 1 addition & 1 deletion .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@ jobs:
- name: Build
run: dotnet build --no-restore ConductorSharp.sln
- name: Test
run: dotnet test --no-restore --verbosity normal ConductorSharp.sln
run: dotnet test --no-restore --verbosity normal test/ConductorSharp.Engine.Tests
6 changes: 6 additions & 0 deletions ConductorSharp.sln
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConductorSharp.Patterns", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConductorSharp.KafkaCancellationNotifier", "src\ConductorSharp.KafkaCancellationNotifier\ConductorSharp.KafkaCancellationNotifier.csproj", "{A94EE48D-17F3-432A-A47D-BCB9B1EF2670}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConductorSharp.Engine.IntegrationTests", "test\ConductorSharp.Engine.IntegrationTests\ConductorSharp.Engine.IntegrationTests.csproj", "{30EACB1C-FB15-4294-AF46-3AF7ABEB2121}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -76,6 +78,10 @@ Global
{A94EE48D-17F3-432A-A47D-BCB9B1EF2670}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A94EE48D-17F3-432A-A47D-BCB9B1EF2670}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A94EE48D-17F3-432A-A47D-BCB9B1EF2670}.Release|Any CPU.Build.0 = Release|Any CPU
{30EACB1C-FB15-4294-AF46-3AF7ABEB2121}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{30EACB1C-FB15-4294-AF46-3AF7ABEB2121}.Debug|Any CPU.Build.0 = Debug|Any CPU
{30EACB1C-FB15-4294-AF46-3AF7ABEB2121}.Release|Any CPU.ActiveCfg = Release|Any CPU
{30EACB1C-FB15-4294-AF46-3AF7ABEB2121}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using ConductorSharp.ApiEnabled.Handlers;
using ConductorSharp.ApiEnabled.Services;
using ConductorSharp.ApiEnabled.Services;
using ConductorSharp.ApiEnabled.Workers;
using ConductorSharp.ApiEnabled.Workers;
using ConductorSharp.ApiEnabled.Workflows;
using ConductorSharp.Engine.Extensions;
using ConductorSharp.Engine.Health;

Expand All @@ -16,23 +18,23 @@ public static IServiceCollection ConfigureApiEnabled(this IServiceCollection hos
maxConcurrentWorkers: configuration.GetValue<int>("Conductor:MaxConcurrentWorkers"),
sleepInterval: configuration.GetValue<int>("Conductor:SleepInterval"),
longPollInterval: configuration.GetValue<int>("Conductor:LongPollInterval"),
domain: configuration.GetValue<string>("Conductor:WorkerDomain"),
typeof(ServiceCollectionExtensions).Assembly
domain: configuration.GetValue<string>("Conductor:WorkerDomain")
)
.SetHealthCheckService<FileHealthService>()
.AddPipelines(pipelines =>
{
pipelines.AddExecutionTaskTracking();
pipelines.AddContextLogging();
pipelines.AddRequestResponseLogging();
pipelines.AddValidation();
});

hostBuilder.AddSingleton<ITaskExecutionCounterService, TaskExecutionCounterService>();
hostBuilder.RegisterWorkerTask<PrepareEmailHandler>(options =>
hostBuilder.RegisterWorkerTask<PrepareEmailWorker>(options =>
{
options.OwnerEmail = "[email protected]";
});
hostBuilder.RegisterWorkerTask<FirstTestWorker.Worker>();
hostBuilder.RegisterWorkerTask<SecondTestWorker.Worker>();
hostBuilder.RegisterWorkflow<TestWorkflow.Workflow>();

return hostBuilder;
}
Expand Down
2 changes: 2 additions & 0 deletions examples/ConductorSharp.ApiEnabled/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,5 @@
app.MapControllers();
app.MapHealthChecks("/health");
app.Run();

public partial class Program { }
33 changes: 33 additions & 0 deletions examples/ConductorSharp.ApiEnabled/Workers/FirstTestWorker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using ConductorSharp.Engine;
using ConductorSharp.Engine.Interface;
using ConductorSharp.Engine.Util;

namespace ConductorSharp.ApiEnabled.Workers
{
public class FirstTestWorker : ITaskInput<FirstTestWorker.Response>
{
public string Input { get; set; }

public class Response
{
public string Output { get; set; }
}

public class Worker : Worker<FirstTestWorker, Response>
{
private readonly ILogger<Worker> _logger;

public Worker(ILogger<Worker> logger)
{
_logger = logger;
}

public override Task<Response> Handle(FirstTestWorker test, WorkerExecutionContext context, CancellationToken cancellationToken)
{
_logger.LogInformation("First test worker");

return Task.FromResult<Response>(new() { Output = test.Input });
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@
using ConductorSharp.Engine.Builders.Metadata;
using ConductorSharp.Engine.Interface;
using ConductorSharp.Engine.Util;
using MediatR;

namespace ConductorSharp.ApiEnabled.Handlers;
namespace ConductorSharp.ApiEnabled.Workers;

public class PrepareEmailRequest : IRequest<PrepareEmailResponse>
public class PrepareEmailRequest : ITaskInput<PrepareEmailResponse>
{
public string CustomerName { get; set; }
public string Address { get; set; }
Expand All @@ -18,18 +17,16 @@ public class PrepareEmailResponse
}

[OriginalName("EMAIL_prepare")]
public class PrepareEmailHandler : ITaskRequestHandler<PrepareEmailRequest, PrepareEmailResponse>
public class PrepareEmailWorker : IWorker<PrepareEmailRequest, PrepareEmailResponse>
{
private readonly ConductorSharpExecutionContext _context;
private readonly ILogger<PrepareEmailHandler> _logger;
private readonly ILogger<PrepareEmailWorker> _logger;

public PrepareEmailHandler(ConductorSharpExecutionContext context, ILogger<PrepareEmailHandler> logger)
public PrepareEmailWorker(ILogger<PrepareEmailWorker> logger)
{
_context = context;
_logger = logger;
}

public async Task<PrepareEmailResponse> Handle(PrepareEmailRequest request, CancellationToken cancellationToken)
public async Task<PrepareEmailResponse> Handle(PrepareEmailRequest request, WorkerExecutionContext context, CancellationToken cancellationToken)
{
var emailBodyBuilder = new StringBuilder();

Expand All @@ -39,8 +36,8 @@ public async Task<PrepareEmailResponse> Handle(PrepareEmailRequest request, Canc
emailBodyBuilder.AppendLine($"Customer: {request.CustomerName}");
emailBodyBuilder.AppendLine($"Address: {request.Address}");
emailBodyBuilder.AppendLine("------------------");
emailBodyBuilder.AppendLine($"WorkflowId : {_context.WorkflowId}");
emailBodyBuilder.AppendLine($"WorkflowName: {_context.WorkflowName}");
emailBodyBuilder.AppendLine($"WorkflowId : {context.WorkflowId}");
emailBodyBuilder.AppendLine($"WorkflowName: {context.WorkflowName}");

_logger.LogInformation("Prepared email");

Expand Down
31 changes: 31 additions & 0 deletions examples/ConductorSharp.ApiEnabled/Workers/SecondTestWorker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using ConductorSharp.Engine;
using ConductorSharp.Engine.Interface;
using ConductorSharp.Engine.Util;

namespace ConductorSharp.ApiEnabled.Workers;

public class SecondTestWorker : ITaskInput<SecondTestWorker.Response>
{
public string Input { get; set; }

public class Response
{
public string Output { get; set; }
}

public class Worker : Worker<SecondTestWorker, Response>
{
private readonly ILogger<Worker> _logger;

public Worker(ILogger<Worker> logger)
{
_logger = logger;
}

public override Task<Response> Handle(SecondTestWorker test, WorkerExecutionContext context, CancellationToken cancellationToken)
{
_logger.LogInformation("Second test worker");
return Task.FromResult<Response>(new() { Output = test.Input });
}
}
}
36 changes: 36 additions & 0 deletions examples/ConductorSharp.ApiEnabled/Workflows/TestWorkflow.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using ConductorSharp.ApiEnabled.Workers;
using ConductorSharp.ApiEnabled.Workers;
using ConductorSharp.Engine.Builders;
using ConductorSharp.Engine.Builders.Metadata;

namespace ConductorSharp.ApiEnabled.Workflows;

public class TestWorkflow : WorkflowInput<TestWorkflow.Output>
{
public string Input { get; set; }

public class Output : WorkflowOutput
{
public string Out { get; set; }
}

[OriginalName("TEST_workflow")]
public class Workflow : Workflow<Workflow, TestWorkflow, Output>
{
public Workflow(WorkflowDefinitionBuilder<Workflow, TestWorkflow, Output> builder)
: base(builder) { }

public FirstTestWorker.Worker FirstWorker { get; set; }

public SecondTestWorker.Worker SecondWorker { get; set; }

public override void BuildDefinition()
{
_builder.AddTask(wf => wf.FirstWorker, wf => new() { Input = wf.Input.Input });

_builder.AddTask(wf => wf.SecondWorker, wf => new() { Input = wf.FirstWorker.Output.Output });

_builder.SetOutput(wf => new() { Out = wf.SecondWorker.Output.Output });
}
}
}
23 changes: 0 additions & 23 deletions examples/ConductorSharp.Definitions/Behaviors/CustomBehavior.cs

This file was deleted.

8 changes: 4 additions & 4 deletions examples/ConductorSharp.Definitions/Generated/Task.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
using ConductorSharp.Engine.Builders.Metadata;
using ConductorSharp.Engine.Interface;
using ConductorSharp.Engine.Model;
using ConductorSharp.Engine.Util;
using MediatR;
using Newtonsoft.Json;

namespace ConductorSharp.Definitions.Generated
{
public partial class EmailPrepareV1Input : IRequest<EmailPrepareV1Output>
public partial class EmailPrepareV1Input : ITaskInput<EmailPrepareV1Output>
{
/// <originalName>
/// address
Expand All @@ -33,7 +33,7 @@ public partial class EmailPrepareV1Output
[OriginalName("EMAIL_prepare")]
public partial class EmailPrepareV1 : SimpleTaskModel<EmailPrepareV1Input, EmailPrepareV1Output> { }

public partial class CustomerGetV1Input : IRequest<CustomerGetV1Output>
public partial class CustomerGetV1Input : ITaskInput<CustomerGetV1Output>
{
/// <originalName>
/// customer_id
Expand Down Expand Up @@ -61,7 +61,7 @@ public partial class CustomerGetV1Output
[OriginalName("CUSTOMER_get")]
public partial class CustomerGetV1 : SimpleTaskModel<CustomerGetV1Input, CustomerGetV1Output> { }

public partial class EnumTaskInput : IRequest<EnumTaskOutput>
public partial class EnumTaskInput : ITaskInput<EnumTaskOutput>
{
/// <originalName>
/// status
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using ConductorSharp.Engine.Interface;
using ConductorSharp.Engine.Util;
using Microsoft.Extensions.Logging;

namespace ConductorSharp.Definitions.Middlewares;

internal class CustomMiddleware<TRequest, TResponse> : IWorkerMiddleware<TRequest, TResponse>
where TRequest : ITaskInput<TResponse>, new()
{
private readonly ILogger<CustomMiddleware<TRequest, TResponse>> _logger;

public CustomMiddleware(ILogger<CustomMiddleware<TRequest, TResponse>> logger)
{
_logger = logger;
}

public async Task<TResponse> Handle(
TRequest request,
WorkerExecutionContext context,
Func<Task<TResponse>> next,
CancellationToken cancellationToken
)
{
_logger.LogInformation("Executed before all middlewares");
var response = await next();
_logger.LogInformation("Executed after all middlewares");
return response;
}
}
8 changes: 3 additions & 5 deletions examples/ConductorSharp.Definitions/Program.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using ConductorSharp.Definitions.Behaviors;
using ConductorSharp.Definitions.Middlewares;
using ConductorSharp.Definitions.Workflows;
using ConductorSharp.Engine.Extensions;
using ConductorSharp.Engine.Health;
Expand All @@ -25,15 +25,13 @@
maxConcurrentWorkers: configuration.GetValue<int>("Conductor:MaxConcurrentWorkers"),
sleepInterval: configuration.GetValue<int>("Conductor:SleepInterval"),
longPollInterval: configuration.GetValue<int>("Conductor:LongPollInterval"),
domain: configuration.GetValue<string>("Conductor:WorkerDomain"),
typeof(Program).Assembly
domain: configuration.GetValue<string>("Conductor:WorkerDomain")
)
.AddConductorSharpPatterns()
.SetHealthCheckService<FileHealthService>()
.AddPipelines(pipelines =>
{
pipelines.AddCustomBehavior(typeof(CustomBehavior<,>));
pipelines.AddRequestResponseLogging();
pipelines.AddCustomMiddleware(typeof(CustomMiddleware<,>));
pipelines.AddValidation();
})
.AddCSharpLambdaTasks();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using ConductorSharp.Engine.Builders;
using ConductorSharp.Engine.Builders.Metadata;
using ConductorSharp.Engine.Interface;
using ConductorSharp.Engine.Model;
using ConductorSharp.Patterns.Builders;
using ConductorSharp.Patterns.Model;
using MediatR;

namespace ConductorSharp.Definitions.Workflows
{
Expand All @@ -18,7 +18,7 @@ public class CSharpLambdaWorkflowOutput : WorkflowOutput { }
[WorkflowMetadata(OwnerEmail = "[email protected]")]
public class CSharpLambdaWorkflow : Workflow<CSharpLambdaWorkflow, CSharpLambdaWorkflowInput, CSharpLambdaWorkflowOutput>
{
public class LambdaTaskInput : IRequest<LambdaTaskOutput>
public class LambdaTaskInput : ITaskInput<LambdaTaskOutput>
{
public string LambdaInput { get; set; }
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
using ConductorSharp.Definitions.Generated;
using ConductorSharp.Engine.Builders;
using ConductorSharp.Engine.Builders.Metadata;
using ConductorSharp.Engine.Interface;
using ConductorSharp.Engine.Model;
using ConductorSharp.Engine.Util;
using ConductorSharp.Patterns.Tasks;
using MediatR;

namespace ConductorSharp.Definitions.Workflows
{
Expand All @@ -21,7 +20,7 @@ public class SendCustomerNotificationOutput : WorkflowOutput
public object Constant { get; set; }
}

public class ExpectedDynamicInput : CustomerGetV1Input, IRequest<ExpectedDynamicOutput> { }
public class ExpectedDynamicInput : CustomerGetV1Input, ITaskInput<ExpectedDynamicOutput> { }

public class ExpectedDynamicOutput : CustomerGetV1Output { }

Expand Down
2 changes: 1 addition & 1 deletion examples/ConductorSharp.Definitions/appsettings.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"Conductor": {
"BaseUrl": "http://localhost:8080",
"BaseUrl": "http://localhost:8127",
"LongPollInterval": 100,
"MaxConcurrentWorkers": 10,
"SleepInterval": 500
Expand Down
Loading
Loading