using Azure.Messaging.ServiceBus.Administration;
using Elsa.Hosting.Management.Notifications;
using Elsa.MassTransit.AzureServiceBus.Services;
using Elsa.Mediator.Contracts;
namespace Elsa.MassTransit.AzureServiceBus.Handlers;
///
/// Class responsible for removing orphaned subscriptions.
///
public class OrphanedSubscriptionRemover(
MessageTopologyProvider topologyProvider,
ServiceBusAdministrationClient client)
: INotificationHandler
{
///
/// Removes orphaned subscriptions from Azure Service Bus.
///
public async Task HandleAsync(InstanceDeactivated notification, CancellationToken cancellationToken)
{
var subscriptionTopology = topologyProvider.GetShortLivedSubscriptions().ToList();
foreach (var subscription in subscriptionTopology)
{
// Get subscriptions based on topics instead of the topology since when names are longer than 50 characters
// MassTransit automatically truncates them.
await foreach (var asbSubscription in client.GetSubscriptionsAsync(subscription.TopicName,
cancellationToken))
{
if (asbSubscription.SubscriptionName.StartsWith($"Elsa-{notification.InstanceName}-"))
{
var queueName = asbSubscription.ForwardTo.Substring(asbSubscription.ForwardTo.LastIndexOf('/') + 1);
await Task.WhenAll(
client.DeleteSubscriptionAsync(subscription.TopicName,
asbSubscription.SubscriptionName,
cancellationToken),
client.DeleteQueueAsync(queueName, cancellationToken));
}
}
}
}
}