From 2bc60d934432fa685d82ab65339d1d0ef7955e12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Uhrbach?= Date: Tue, 13 Apr 2021 22:55:11 +0200 Subject: [PATCH] Added small example to prove functionality for receiving masstransit messages --- .../Controllers/TriggerMessageController.cs | 37 +++++++++++++ .../Elsa.Samples.MassTransitRabbitMq.csproj | 14 +++++ .../Messages/FirstMessage.cs | 14 +++++ .../Messages/SecondMessage.cs | 14 +++++ .../Program.cs | 14 +++++ .../Startup.cs | 54 +++++++++++++++++++ .../Workflows/TestWorkflow.cs | 29 ++++++++++ 7 files changed, 176 insertions(+) create mode 100644 src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Controllers/TriggerMessageController.cs create mode 100644 src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Elsa.Samples.MassTransitRabbitMq.csproj create mode 100644 src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Messages/FirstMessage.cs create mode 100644 src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Messages/SecondMessage.cs create mode 100644 src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Program.cs create mode 100644 src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Startup.cs create mode 100644 src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Workflows/TestWorkflow.cs diff --git a/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Controllers/TriggerMessageController.cs b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Controllers/TriggerMessageController.cs new file mode 100644 index 000000000..cf9ac5d1e --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Controllers/TriggerMessageController.cs @@ -0,0 +1,37 @@ +using MassTransit; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Elsa.Samples.MassTransitRabbitMq.Messages; + +namespace Elsa.Samples.MassTransitRabbitMq.Controllers +{ + [ApiController] + [Route("trigger-message")] + public class TriggerMessageController : Controller + { + private readonly IPublishEndpoint _publishEndpoint; + + public TriggerMessageController(IPublishEndpoint publishEndpoint) + { + _publishEndpoint = publishEndpoint; + } + + [Route("first")] + [HttpPost] + public async Task TriggerFirstMessage() + { + var message = new FirstMessage(); + await _publishEndpoint.Publish(message); + return Ok(); + } + + [Route("second")] + [HttpPost] + public async Task TriggerSecondMessage() + { + var message = new SecondMessage(); + await _publishEndpoint.Publish(message); + return Ok(); + } + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Elsa.Samples.MassTransitRabbitMq.csproj b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Elsa.Samples.MassTransitRabbitMq.csproj new file mode 100644 index 000000000..4d829f3b2 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Elsa.Samples.MassTransitRabbitMq.csproj @@ -0,0 +1,14 @@ + + + + net5.0 + false + + + + + + + + + diff --git a/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Messages/FirstMessage.cs b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Messages/FirstMessage.cs new file mode 100644 index 000000000..3f1870663 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Messages/FirstMessage.cs @@ -0,0 +1,14 @@ +using System; + +namespace Elsa.Samples.MassTransitRabbitMq.Messages +{ + public class SecondMessage + { + public Guid CorrelationId { get; private set; } + + public SecondMessage() + { + CorrelationId = Guid.Parse("e9ca46dd-36b9-4fc4-b7db-3bb7190e4488"); + } + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Messages/SecondMessage.cs b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Messages/SecondMessage.cs new file mode 100644 index 000000000..4e5bc6c0e --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Messages/SecondMessage.cs @@ -0,0 +1,14 @@ +using System; + +namespace Elsa.Samples.MassTransitRabbitMq.Messages +{ + public class FirstMessage + { + public Guid CorrelationId { get; private set; } + + public FirstMessage() + { + CorrelationId = Guid.Parse("e9ca46dd-36b9-4fc4-b7db-3bb7190e4488"); + } + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Program.cs b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Program.cs new file mode 100644 index 000000000..25d99fb74 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Program.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace Elsa.Samples.MassTransitRabbitMq +{ + public class Program + { + public static void Main(string[] args) => CreateHostBuilder(args).Build().Run(); + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Startup.cs b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Startup.cs new file mode 100644 index 000000000..5634df711 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Startup.cs @@ -0,0 +1,54 @@ +using System; +using MassTransit; +using Elsa.Samples.MassTransitRabbitMq.Messages; +using Elsa.Samples.MassTransitRabbitMq.Workflows; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Elsa.Activities.MassTransit.Extensions; +using Elsa.Activities.MassTransit.Consumers; + +namespace Elsa.Samples.MassTransitRabbitMq +{ + public class Startup + { + private Type CreateWorkflowConsumer(Type messageType) => typeof(WorkflowConsumer<>).MakeGenericType(messageType); + + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); + + services + .AddMassTransit(x => + { + // Add workflow consumer for message + x.AddConsumer(CreateWorkflowConsumer(typeof(FirstMessage))); + x.AddConsumer(CreateWorkflowConsumer(typeof(SecondMessage))); + + // Configure rabbitmq + x.UsingRabbitMq((ctx, cfg) => + { + cfg.ConfigureEndpoints(ctx); + cfg.Host("rabbitmq://guest:guest@localhost"); + }); + }) + .AddMassTransitHostedService(); + + services + .AddElsa(options => options + .AddConsoleActivities() + .AddMassTransitActivities() + .AddWorkflow() + ); + } + + public void Configure(IApplicationBuilder app) + { + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + } + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Workflows/TestWorkflow.cs b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Workflows/TestWorkflow.cs new file mode 100644 index 000000000..3b2d88c26 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.MassTransitRabbitMq/Workflows/TestWorkflow.cs @@ -0,0 +1,29 @@ +using Elsa.Activities.Console; +using Elsa.Activities.MassTransit; +using Elsa.Activities.Primitives; +using Elsa.Builders; +using Elsa.Samples.MassTransitRabbitMq.Messages; +using Elsa.Activities.ControlFlow; +using System; + +namespace Elsa.Samples.MassTransitRabbitMq.Workflows +{ + public class TestWorkflow : IWorkflow + { + public void Build(IWorkflowBuilder builder) + { + builder + .ReceiveMassTransitMessage( + activity => activity.Set(x => x.MessageType, x => typeof(FirstMessage)) + ) + .Correlate(activity => activity.Set(x => x.Value, context => context.GetInput().CorrelationId.ToString())) + .WriteLine(context => $"Received first message") + + // Wait until second message received with the same correlation id + .ReceiveMassTransitMessage( + activity => activity.Set(x => x.MessageType, x => typeof(SecondMessage)) + ) + .WriteLine(context => $"Received second message"); + } + } +} \ No newline at end of file