diff --git a/Elsa.sln b/Elsa.sln index 46579a021..0d68b277f 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -140,6 +140,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.AspNet.Webhook EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.AspNet.MassTransitActivities", "samples\aspnet\Elsa.Samples.AspNet.MassTransitActivities\Elsa.Samples.AspNet.MassTransitActivities.csproj", "{A1A8AD89-C9C4-41BF-BBCB-EF0544A28BFB}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.AspNet.MassTransitWorkflow", "samples\aspnet\Elsa.Samples.AspNet.MassTransitWorkflow\Elsa.Samples.AspNet.MassTransitWorkflow.csproj", "{086A7E2A-6CE7-41DA-927B-C033638060B1}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.ProtoActor.Cluster.AzureContainerApps", "src\modules\Elsa.ProtoActor.Cluster.AzureContainerApps\Elsa.ProtoActor.Cluster.AzureContainerApps.csproj", "{9F79BBEC-02CE-4F76-AED4-BC191DA3054B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.AspNet.AzureServiceBusActivities", "samples\aspnet\Elsa.Samples.AspNet.AzureServiceBusActivities\Elsa.Samples.AspNet.AzureServiceBusActivities.csproj", "{C25CFDCF-8E06-4DD8-A83E-FF7EF9FDA02E}" @@ -780,6 +782,10 @@ Global {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Debug|Any CPU.Build.0 = Debug|Any CPU {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Release|Any CPU.ActiveCfg = Release|Any CPU {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}.Release|Any CPU.Build.0 = Release|Any CPU + {086A7E2A-6CE7-41DA-927B-C033638060B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {086A7E2A-6CE7-41DA-927B-C033638060B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {086A7E2A-6CE7-41DA-927B-C033638060B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {086A7E2A-6CE7-41DA-927B-C033638060B1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -918,6 +924,7 @@ Global {A516931E-EDBB-4FC3-BB94-1BB824D5BC61} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} {BBCE36D1-6767-4ED1-B3E8-84D2567A962A} = {A516931E-EDBB-4FC3-BB94-1BB824D5BC61} {73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79} + {086A7E2A-6CE7-41DA-927B-C033638060B1} = {56C2FFB8-EA54-45B5-A095-4A78142EB4B5} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D4B5CEAA-7D70-4FCB-A68E-B03FBE5E0E5E} diff --git a/samples/aspnet/Elsa.Samples.AspNet.MassTransitActivities/Program.cs b/samples/aspnet/Elsa.Samples.AspNet.MassTransitActivities/Program.cs index 405f28a5a..e9c8fe164 100644 --- a/samples/aspnet/Elsa.Samples.AspNet.MassTransitActivities/Program.cs +++ b/samples/aspnet/Elsa.Samples.AspNet.MassTransitActivities/Program.cs @@ -21,6 +21,7 @@ builder.Services.AddElsa(elsa => elsa.UseWorkflowRuntime(runtime => { runtime.UseEntityFrameworkCore(); + runtime.UseMassTransitDispatcher(); }); // Expose API endpoints. diff --git a/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Elsa.Samples.AspNet.MassTransitWorkflow.csproj b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Elsa.Samples.AspNet.MassTransitWorkflow.csproj new file mode 100644 index 000000000..9de912f82 --- /dev/null +++ b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Elsa.Samples.AspNet.MassTransitWorkflow.csproj @@ -0,0 +1,24 @@ + + + + net8.0 + + + + + + + + + + + + + + + + + <_ContentIncludedByDefault Remove="Pages\Index.cshtml" /> + <_ContentIncludedByDefault Remove="Pages\_ViewImports.cshtml" /> + + diff --git a/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Endpoints/Messages/Create/Endpoint.cs b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Endpoints/Messages/Create/Endpoint.cs new file mode 100644 index 000000000..d3ac54915 --- /dev/null +++ b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Endpoints/Messages/Create/Endpoint.cs @@ -0,0 +1,29 @@ +using Elsa.Samples.AspNet.MassTransitWorkflow.Messages; +using FastEndpoints; +using MassTransit; + +namespace Elsa.Samples.AspNet.MassTransitWorkflow.Endpoints.Messages.Create; + +public class Create : EndpointWithoutRequest +{ + private readonly IBus _bus; + + public Create(IBus bus) + { + _bus = bus; + } + + public override void Configure() + { + Post("messages"); + AllowAnonymous(); + } + + public override async Task HandleAsync(CancellationToken cancellationToken) + { + await _bus.Publish(new Message + { + Content = "Hello World from the bus." + }, cancellationToken); + } +} \ No newline at end of file diff --git a/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Messages/Message.cs b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Messages/Message.cs new file mode 100644 index 000000000..7595bb8c9 --- /dev/null +++ b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Messages/Message.cs @@ -0,0 +1,6 @@ +namespace Elsa.Samples.AspNet.MassTransitWorkflow.Messages; + +public class Message +{ + public string Content { get; set; } +} diff --git a/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Program.cs b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Program.cs new file mode 100644 index 000000000..6c6918318 --- /dev/null +++ b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Program.cs @@ -0,0 +1,45 @@ +using Elsa.EntityFrameworkCore.Modules.Management; +using Elsa.EntityFrameworkCore.Modules.Runtime; +using Elsa.Extensions; +using Elsa.Samples.AspNet.MassTransitWorkflow.Messages; + +var builder = WebApplication.CreateBuilder(args); +var configuration = builder.Configuration; +var rabbitMqConnectionString = configuration.GetConnectionString("RabbitMq")!; + +// Add services to the container. +builder.Services.AddElsa(elsa => +{ + // Configure management feature to use EF Core. + elsa.UseWorkflowManagement(management => management.UseEntityFrameworkCore()); + + // Configure runtime feature to use EF Core. + elsa.UseWorkflowRuntime(runtime => + { + runtime.UseEntityFrameworkCore(); + runtime.UseMassTransitDispatcher(); + }); + + // Expose API endpoints. + elsa.UseWorkflowsApi(api => api.AddFastEndpointsAssembly()); + + // Register programmatically defined workflows. + elsa.AddWorkflowsFrom(); + + // Configure MassTransit. + elsa.UseMassTransit(massTransit => + { + // massTransit.UseRabbitMq(rabbitMqConnectionString); + massTransit.AddMessageType(); + }); +}); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +app.UseHttpsRedirection(); +app.UseWorkflowsApi(); + +app.MapGet("/", ctx => ctx.Response.WriteAsync("Call 'POST /elsa/api/messages' to send a message over MassTransit.")); + +app.Run(); \ No newline at end of file diff --git a/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Properties/launchSettings.json b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Properties/launchSettings.json new file mode 100644 index 000000000..1753d9988 --- /dev/null +++ b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Properties/launchSettings.json @@ -0,0 +1,37 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:38703", + "sslPort": 44342 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5207", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7299;http://localhost:5207", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Workflows/MessagingWorkflow.cs b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Workflows/MessagingWorkflow.cs new file mode 100644 index 000000000..f5269d4ad --- /dev/null +++ b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/Workflows/MessagingWorkflow.cs @@ -0,0 +1,31 @@ +using Elsa.MassTransit.Activities; +using Elsa.Samples.AspNet.MassTransitWorkflow.Messages; +using Elsa.Workflows; +using Elsa.Workflows.Activities; +using Elsa.Workflows.Contracts; +using Elsa.Workflows.Helpers; + +namespace Elsa.Samples.AspNet.MassTransitWorkflow.Workflows; + +public class MessagingWorkflow : WorkflowBase +{ + protected override void Build(IWorkflowBuilder builder) + { + var busMessage = builder.WithVariable(); + + builder.Root = new Sequence + { + Activities = + { + new MessageReceived + { + CanStartWorkflow = true, + Type = ActivityTypeNameHelper.GenerateTypeName(typeof(Message)), + MessageType = typeof(Message), + Result = new (busMessage) + }, + new WriteLine(context => $"Received message from Bus: {busMessage.Get(context)?.Content}") + } + }; + } +} \ No newline at end of file diff --git a/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/appsettings.json b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/appsettings.json new file mode 100644 index 000000000..a63e01af2 --- /dev/null +++ b/samples/aspnet/Elsa.Samples.AspNet.MassTransitWorkflow/appsettings.json @@ -0,0 +1,13 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Microsoft.EntityFrameworkCore": "Warning" + } + }, + "AllowedHosts": "*", + "ConnectionStrings": { + "RabbitMq": "rabbitmq://guest:guest@localhost" + } +}