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); } }