public void Subscribe <TMessage>(RabbitConnectionSettings settings, bool isDurable, Func <TMessage, Task> handler, IMessageDeserializer <TMessage> deserializer) { var subscriptionSettings = new RabbitMqSubscriptionSettings { ConnectionString = settings.ConnectionString, QueueName = $"{settings.ExchangeName}.{PlatformServices.Default.Application.ApplicationName}.{settings.RoutingKey ?? "all"}", ExchangeName = settings.ExchangeName, RoutingKey = settings.RoutingKey, IsDurable = isDurable, }; var rabbitMqSubscriber = new RabbitMqSubscriber <TMessage>(subscriptionSettings, new DefaultErrorHandlingStrategy(_logger, subscriptionSettings)) .SetMessageDeserializer(deserializer) .Subscribe(handler) .SetLogger(_logger); if (!_subscribers.TryAdd(subscriptionSettings.QueueName, rabbitMqSubscriber)) { throw new InvalidOperationException( $"A subscriber for queue {subscriptionSettings.QueueName} was already initialized"); } rabbitMqSubscriber.Start(); }
public RabbitMqPublisher <TMessage> GetProducer <TMessage>(RabbitConnectionSettings settings, bool isDurable, IRabbitMqSerializer <TMessage> serializer) { var subscriptionSettings = new RabbitMqSubscriptionSettings { ConnectionString = settings.ConnectionString, ExchangeName = settings.ExchangeName, IsDurable = isDurable, }; return((RabbitMqPublisher <TMessage>)_producers.GetOrAdd(subscriptionSettings, CreateProducer).Value); Lazy <IStopable> CreateProducer(RabbitMqSubscriptionSettings s) { // Lazy ensures RabbitMqPublisher will be created and started only once // https://andrewlock.net/making-getoradd-on-concurrentdictionary-thread-safe-using-lazy/ return(new Lazy <IStopable>(() => new RabbitMqPublisher <TMessage>(s) .DisableInMemoryQueuePersistence() .SetSerializer(serializer) .SetPublishStrategy(new TopicPublishStrategy()) .SetLogger(_logger) .PublishSynchronously() .Start())); } }
static void Main(string[] args) { var settings = new RabbitConnectionSettings { HostName = "localhost", UserName = "******", Password = "******", Port = 5672, VirtualHost = "/" }; var client = new SimpleRabbitClient(settings, new JsonByteArraySerializer()); }