Beispiel #1
0
        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();
        }
Beispiel #2
0
        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()));
            }
        }
Beispiel #3
0
 static void Main(string[] args)
 {
     var settings = new RabbitConnectionSettings
     {
         HostName    = "localhost",
         UserName    = "******",
         Password    = "******",
         Port        = 5672,
         VirtualHost = "/"
     };
     var client = new SimpleRabbitClient(settings, new JsonByteArraySerializer());
 }