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;
///
/// Creates workers for each trigger & bookmark in response to updated workflow trigger indexes and bookmarks.
///
public class UpdateWorkers : INotificationHandler, INotificationHandler, INotificationHandler
{
private readonly IPayloadSerializer _serializer;
private readonly IWorkerManager _workerManager;
public UpdateWorkers(IPayloadSerializer serializer, IWorkerManager workerManager)
{
_serializer = serializer;
_workerManager = workerManager;
}
///
/// Adds, updates and removes workers based on added and removed triggers.
///
public async Task HandleAsync(WorkflowTriggersIndexed notification, CancellationToken cancellationToken)
{
var added = notification.IndexedWorkflow.AddedTriggers.Filter().Select(x => DeserializePayload(x.Payload!));
var removed = notification.IndexedWorkflow.RemovedTriggers.Filter().Select(x => DeserializePayload(x.Payload!));
await StopWorkersAsync(removed, cancellationToken);
await StartWorkersAsync(added, cancellationToken);
}
///
/// Removes workers based on removed bookmarks.
///
public async Task HandleAsync(WorkflowBookmarksDeleted notification, CancellationToken cancellationToken)
{
var payloads = notification.Bookmarks.Filter().Select(x => DeserializePayload(x.Payload!));
await StopWorkersAsync(payloads, cancellationToken);
}
///
/// Starts workers based on added bookmarks.
///
public async Task HandleAsync(WorkflowBookmarksSaved notification, CancellationToken cancellationToken)
{
var payloads = notification.Bookmarks.Filter().Select(x => DeserializePayload(x.Payload!));
await StartWorkersAsync(payloads, cancellationToken);
}
private MessageReceivedTriggerPayload DeserializePayload(string payload) => _serializer.Deserialize(payload);
private ICollection DeserializePayloads(IEnumerable payloads) => payloads.Select(_serializer.Deserialize).ToList();
private async Task StartWorkersAsync(IEnumerable payloads, CancellationToken cancellationToken)
{
foreach (var payload in payloads) await _workerManager.StartWorkerAsync(payload.QueueOrTopic, payload.Subscription, cancellationToken);
}
private async Task StopWorkersAsync(IEnumerable payloads, CancellationToken cancellationToken)
{
foreach (var payload in payloads) await _workerManager.StopWorkerAsync(payload.QueueOrTopic, payload.Subscription, cancellationToken);
}
}