using Elsa.MassTransit.Activities;
using Elsa.Workflows.Helpers;
using Elsa.Workflows.Runtime.Contracts;
using Elsa.Workflows.Runtime.Requests;
using MassTransit;
namespace Elsa.MassTransit.Consumers;
///
/// A consumer of various dispatch message types to asynchronously execute workflows.
///
public class WorkflowMessageConsumer : IConsumer where T : class
{
private readonly IWorkflowDispatcher _workflowRuntime;
///
/// Constructor.
///
public WorkflowMessageConsumer(IWorkflowDispatcher workflowRuntime)
{
_workflowRuntime = workflowRuntime;
}
///
public async Task Consume(ConsumeContext context)
{
var cancellationToken = context.CancellationToken;
var messageType = typeof(T);
var message = context.Message;
var activityTypeName = ActivityTypeNameHelper.GenerateTypeName(messageType);
var bookmark = new MessageReceivedBookmarkPayload(messageType);
var correlationId = context.CorrelationId?.ToString();
var input = new Dictionary { [MessageReceived.InputKey] = message };
var request = new DispatchTriggerWorkflowsRequest(activityTypeName, bookmark)
{
CorrelationId = correlationId,
Input = input
};
await _workflowRuntime.DispatchAsync(request, cancellationToken: cancellationToken);
}
}