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"
+ }
+}