elsa-core/src/modules/Elsa.Modules.AzureServiceBus/Handlers/UpdateWorkers.cs
2022-02-22 12:51:59 +01:00

68 lines
3.2 KiB
C#

using Elsa.Contracts;
using Elsa.Mediator.Contracts;
using Elsa.Modules.AzureServiceBus.Activities;
using Elsa.Modules.AzureServiceBus.Contracts;
using Elsa.Modules.AzureServiceBus.Models;
using Elsa.Persistence.Extensions;
using Elsa.Runtime.Models;
using Elsa.Runtime.Notifications;
namespace Elsa.Modules.AzureServiceBus.Handlers;
/// <summary>
/// Creates workers for each trigger & bookmark in response to updated workflow trigger indexes and bookmarks.
/// </summary>
public class UpdateWorkers : INotificationHandler<WorkflowTriggersIndexed>, INotificationHandler<WorkflowBookmarksDeleted>, INotificationHandler<WorkflowBookmarksSaved>
{
private readonly IPayloadSerializer _serializer;
private readonly IWorkerManager _workerManager;
public UpdateWorkers(IPayloadSerializer serializer, IWorkerManager workerManager)
{
_serializer = serializer;
_workerManager = workerManager;
}
/// <summary>
/// Adds, updates and removes workers based on added and removed triggers.
/// </summary>
public async Task HandleAsync(WorkflowTriggersIndexed notification, CancellationToken cancellationToken)
{
var added = notification.IndexedWorkflow.AddedTriggers.Filter<MessageReceived>().Select(x => DeserializePayload(x.Payload!));
var removed = notification.IndexedWorkflow.RemovedTriggers.Filter<MessageReceived>().Select(x => DeserializePayload(x.Payload!));
await StopWorkersAsync(removed, cancellationToken);
await StartWorkersAsync(added, cancellationToken);
}
/// <summary>
/// Removes workers based on removed bookmarks.
/// </summary>
public async Task HandleAsync(WorkflowBookmarksDeleted notification, CancellationToken cancellationToken)
{
var payloads = notification.Bookmarks.Filter<MessageReceived>().Select(x => DeserializePayload(x.Payload!));
await StopWorkersAsync(payloads, cancellationToken);
}
/// <summary>
/// Starts workers based on added bookmarks.
/// </summary>
public async Task HandleAsync(WorkflowBookmarksSaved notification, CancellationToken cancellationToken)
{
var payloads = notification.Bookmarks.Filter<MessageReceived>().Select(x => DeserializePayload(x.Payload!));
await StartWorkersAsync(payloads, cancellationToken);
}
private MessageReceivedTriggerPayload DeserializePayload(string payload) => _serializer.Deserialize<MessageReceivedTriggerPayload>(payload);
private ICollection<MessageReceivedTriggerPayload> DeserializePayloads(IEnumerable<string> payloads) => payloads.Select(_serializer.Deserialize<MessageReceivedTriggerPayload>).ToList();
private async Task StartWorkersAsync(IEnumerable<MessageReceivedTriggerPayload> payloads, CancellationToken cancellationToken)
{
foreach (var payload in payloads) await _workerManager.StartWorkerAsync(payload.QueueOrTopic, payload.Subscription, cancellationToken);
}
private async Task StopWorkersAsync(IEnumerable<MessageReceivedTriggerPayload> payloads, CancellationToken cancellationToken)
{
foreach (var payload in payloads) await _workerManager.StopWorkerAsync(payload.QueueOrTopic, payload.Subscription, cancellationToken);
}
}