elsa-core/src/activities/Elsa.Activities.RabbitMq/Services/Client.cs
Konstantins Vedenins 2a9c8d0b7e
Added exchange name property, removed auto delete for bindings (#2622)
Added Exchange Name property to give ability to subscribe/publish to specific exchange. Removed binding auto-delete to preserve binding in case of disconnect.  Added RabbitMQ connection string format to connection string property tooltip.
2021-12-22 13:52:56 +01:00

86 lines
2.7 KiB
C#

using Elsa.Activities.RabbitMq.Configuration;
using Rebus.Activation;
using Rebus.Bus;
using Rebus.Config;
using Rebus.Messages;
using Rebus.Routing.TransportMessages;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Elsa.Activities.RabbitMq.Services
{
public class Client : IClient
{
private BuiltinHandlerActivator _activator;
private IBus? _bus;
public RabbitMqBusConfiguration Configuration { get; }
public Client(RabbitMqBusConfiguration configuration)
{
Configuration = configuration;
_activator = new BuiltinHandlerActivator();
}
public void SubscribeWithHandler(Func<TransportMessage, CancellationToken, Task> handler)
{
if (_bus != null) return;
_bus = Configure
.With(_activator)
.Options(o => o.SetNumberOfWorkers(0))
.Routing(r => r.AddTransportMessageForwarder(async transportMessage =>
{
if (!AllHeadersMatch(transportMessage.Headers)) return ForwardAction.None;
await handler(transportMessage, CancellationToken.None);
return ForwardAction.Ignore();
}))
.Transport(t =>
{
t.UseRabbitMq(Configuration.ConnectionString, $"Elsa{Guid.NewGuid().ToString("n").ToUpper()}");
})
.Start();
_bus.Advanced.Topics.Subscribe(Configuration.TopicFullName);
}
public async Task PublishMessage(string message)
{
if (_bus == null) ConfigureAsOneWayClient();
await _bus!.Advanced.Topics.Publish(Configuration.TopicFullName, message, Configuration.Headers);
}
public void Dispose()
{
_activator.Dispose();
}
public void StartClient()
{
if (_bus?.Advanced.Workers.Count == 0)
_bus.Advanced.Workers.SetNumberOfWorkers(1);
}
public void StopClient()
{
if (_bus?.Advanced.Workers.Count == 1)
_bus.Advanced.Workers.SetNumberOfWorkers(0);
}
private void ConfigureAsOneWayClient()
{
_bus = Configure
.With(_activator)
.Transport(t => t.UseRabbitMqAsOneWayClient(Configuration.ConnectionString).InputQueueOptions(o => o.SetAutoDelete(autoDelete: true)))
.Start();
}
private bool AllHeadersMatch(Dictionary<string, string> messageHeaders) => Configuration.Headers.All(x => messageHeaders.ContainsKey(x.Key) && messageHeaders[x.Key] == x.Value);
}
}