Ejemplo n.º 1
0
        public MemoryMessageBus(MessageBusSettings settings, MemoryMessageBusSettings providerSettings) : base(settings)
        {
            _logger          = LoggerFactory.CreateLogger <MemoryMessageBus>();
            ProviderSettings = providerSettings ?? throw new ArgumentNullException(nameof(providerSettings));

            OnBuildProvider();
        }
Ejemplo n.º 2
0
        public EventHubMessageBus(MessageBusSettings settings, EventHubMessageBusSettings eventHubSettings)
            : base(settings)
        {
            EventHubSettings = eventHubSettings;

            _producersByTopic.ValueFactory = topic =>
            {
                Log.DebugFormat("Creating EventHubClient for path {0}", topic);
                return(EventHubSettings.EventHubClientFactory(topic));
            };

            Log.Info("Creating consumers");
            foreach (var consumerSettings in settings.Consumers)
            {
                Log.InfoFormat("Creating consumer for Topic: {0}, Group: {1}, MessageType: {2}", consumerSettings.Topic, consumerSettings.Group, consumerSettings.MessageType);
                //var consumer = new EventHubConsumer(this, group, messageType, subscribersByMessageType.ToList());
                _consumers.Add(new EventHubConsumer(this, consumerSettings));
            }

            if (settings.RequestResponse != null)
            {
                Log.InfoFormat("Creating response consumer for Topic: {0}, Group: {1}", settings.RequestResponse.Topic, settings.RequestResponse.Group);
                // _consumers.Add(new EvenHubResponseConsumer(this, settings.RequestResponse));
                _consumers.Add(new EventHubConsumer(this, settings.RequestResponse));
            }
        }
        public KafkaMessageBus(MessageBusSettings settings, KafkaMessageBusSettings kafkaSettings)
            : base(settings)
        {
            AssertSettings(settings);

            KafkaSettings = kafkaSettings;

            Log.Info("Creating producer");
            _producer = CreateProducer();
            Log.InfoFormat("Producer has been assigned name: {0}", _producer.Name);

            Log.Info("Creating subscribers");
            foreach (var subscribersByGroup in settings.Consumers.GroupBy(x => x.Group))
            {
                var group = subscribersByGroup.Key;

                foreach (var subscribersByMessageType in subscribersByGroup.GroupBy(x => x.MessageType))
                {
                    var messageType = subscribersByMessageType.Key;

                    Log.InfoFormat("Creating consumer for topics {0}, group {1}, message type {2}", string.Join(",", subscribersByMessageType.Select(x => x.Topic)), group, messageType);
                    var consumer = new KafkaGroupConsumer(this, group, messageType, subscribersByMessageType.ToList());
                    _groupConsumers.Add(consumer);
                }
            }

            if (settings.RequestResponse != null)
            {
                Log.InfoFormat("Creating response consumer for topic {0} and group {1}", settings.RequestResponse.Group, settings.RequestResponse.Topic);
                _groupConsumers.Add(new KafkaResponseConsumer(this, settings.RequestResponse));
            }
        }
Ejemplo n.º 4
0
        public HybridMessageBus(MessageBusSettings settings, HybridMessageBusSettings providerSettings)
        {
            Settings         = settings ?? throw new ArgumentNullException(nameof(settings));
            ProviderSettings = providerSettings ?? throw new ArgumentNullException(nameof(providerSettings));

            // Use the configured logger factory, if not provided try to resolve from DI, if also not available supress logging using the NullLoggerFactory
            LoggerFactory = settings.LoggerFactory
                            ?? (ILoggerFactory)settings.DependencyResolver?.Resolve(typeof(ILoggerFactory))
                            ?? NullLoggerFactory.Instance;

            _logger = LoggerFactory.CreateLogger <HybridMessageBus>();

            _routeByMessageType = new Dictionary <Type, string>();

            _busByName = new Dictionary <string, MessageBusBase>(providerSettings.Count);
            foreach (var name in providerSettings.Keys)
            {
                var builderFunc = providerSettings[name];

                var bus = BuildBus(builderFunc);

                _busByName.Add(name, bus);

                BuildAutoRouting(name, bus);
            }

            // ToDo: defer start of busses until here
        }
Ejemplo n.º 5
0
        public EventHubMessageBus(MessageBusSettings settings, EventHubMessageBusSettings eventHubSettings)
            : base(settings)
        {
            ProviderSettings = eventHubSettings;

            OnBuildProvider();
        }
        public EventHubMessageBus(MessageBusSettings settings, EventHubMessageBusSettings eventHubSettings)
            : base(settings)
        {
            _logger          = LoggerFactory.CreateLogger <EventHubMessageBus>();
            ProviderSettings = eventHubSettings;

            OnBuildProvider();
        }
 private static void AssertSettings(MessageBusSettings settings)
 {
     if (settings.RequestResponse != null)
     {
         Assert.IsTrue(settings.RequestResponse.Group != null,
                       () => new InvalidConfigurationMessageBusException($"Request-response: group was not provided"));
     }
 }
Ejemplo n.º 8
0
        public MessageBusTested(MessageBusSettings settings)
            : base(settings)
        {
            // by default no responses will arrive
            OnReply = (type, payload, req) => null;

            OnBuildProvider();
        }
 public ElasticStorage(
     IElasticClient client,
     ILogger <ElasticStorage> logger,
     MessageBusSettings settings)
 {
     _client   = client;
     _logger   = logger;
     _settings = settings;
 }
Ejemplo n.º 10
0
 public ChannelPool(
     IConnection connection,
     MessageBusSettings settings,
     ILogger <ChannelPool> logger)
 {
     _channels   = new ConcurrentBag <IModel>();
     _connection = connection;
     _maxCount   = settings.MaxConcurrentChannels;
     _logger     = logger;
 }
Ejemplo n.º 11
0
        public KafkaMessageBus(MessageBusSettings settings, KafkaMessageBusSettings providerSettings)
            : base(settings)
        {
            ProviderSettings = providerSettings ?? throw new ArgumentNullException(nameof(providerSettings));

            OnBuildProvider();

            // TODO: Auto start should be a setting
            Start();
        }
Ejemplo n.º 12
0
        private static void AssertSettings(MessageBusSettings settings)
        {
            Assert.IsTrue(settings.Serializer != null,
                          () => new InvalidConfigurationMessageBusException($"Serializer was not provided"));

            if (settings.RequestResponse != null)
            {
                Assert.IsTrue(settings.RequestResponse.Topic != null,
                              () => new InvalidConfigurationMessageBusException($"Request-response: topic was not provided"));
            }
        }
        private static void AssertSettings(MessageBusSettings settings)
        {
            if (settings.RequestResponse != null)
            {
                Assert.IsTrue(settings.RequestResponse.Group != null,
                              () => new InvalidConfigurationMessageBusException($"Request-response: group was not provided"));

                Assert.IsFalse(settings.Consumers.Any(x => x.Group == settings.RequestResponse.Group && x.Topic == settings.RequestResponse.Topic),
                               () => new InvalidConfigurationMessageBusException($"Request-response: cannot use topic that is already being used by a consumer"));
            }
        }
Ejemplo n.º 14
0
        public MemoryMessageBus(MessageBusSettings settings, MemoryMessageBusSettings providerSettings)
            : base(settings)
        {
            ProviderSettings = providerSettings;

            var consumers = settings.Consumers.Select(x => new ConsumerRuntimeInfo(x)).ToList();

            _consumersByTopic = consumers
                                .GroupBy(x => x.ConsumerSettings.Topic)
                                .ToDictionary(x => x.Key, x => x.ToList());
        }
Ejemplo n.º 15
0
        protected MessageBusBase(MessageBusSettings settings)
        {
            Settings = settings ?? throw new ArgumentNullException(nameof(settings));

            // Use the configured logger factory, if not provided try to resolve from DI, if also not available supress logging using the NullLoggerFactory
            LoggerFactory = settings.LoggerFactory
                            ?? (ILoggerFactory)settings.DependencyResolver?.Resolve(typeof(ILoggerFactory))
                            ?? NullLoggerFactory.Instance;

            _logger = LoggerFactory.CreateLogger <MessageBusBase>();
        }
Ejemplo n.º 16
0
        public KafkaMessageBus(MessageBusSettings settings, KafkaMessageBusSettings providerSettings)
            : base(settings)
        {
            _logger          = LoggerFactory.CreateLogger <KafkaMessageBus>();
            ProviderSettings = providerSettings ?? throw new ArgumentNullException(nameof(providerSettings));

            OnBuildProvider();

            // TODO: Auto start should be a setting
            Start();
        }
Ejemplo n.º 17
0
        public PipelineBuilder(Action <PipelineContext> publish, MessageBusSettings settings)
        {
            Steps = new List <Step>();
            Steps.Add(new Step(WellKnownStep.MutateOutgoingMessages));
            Steps.Add(new Step(WellKnownStep.MutateOutgoingTransportMessage));

            Steps.Add(new PipelineStages.GetTopicStage(settings));
            Steps.Add(new PipelineStages.GetRequestTimeoutStage(settings));
            Steps.Add(new PipelineStages.SerializeTransportMessageStage(settings.Serializer));
            Steps.Add(new SendInternalStage(settings));
            Steps.Add(new PipelineStages.SerializeRequestResponseMessage(settings.Serializer, settings.MessageWithHeadersSerializer, settings.RequestResponse));
            Steps.Add(new PublishStage(publish));
        }
Ejemplo n.º 18
0
 public KafkaMessageBusTest()
 {
     MbSettings = new MessageBusSettings
     {
         Serializer         = new Mock <IMessageSerializer>().Object,
         DependencyResolver = new Mock <IDependencyResolver>().Object
     };
     KafkaMbSettings = new KafkaMessageBusSettings("host")
     {
         ProducerFactory = (producerSettings) => new Mock <Producer>(Enumerable.Empty <KeyValuePair <string, object> >()).Object
     };
     KafkaMb = new Lazy <WrappedKafkaMessageBus>(() => new WrappedKafkaMessageBus(MbSettings, KafkaMbSettings));
 }
Ejemplo n.º 19
0
        public RedisMessageBus(MessageBusSettings settings, RedisMessageBusSettings redisSettings)
            : base(settings)
        {
            RedisSettings = redisSettings;
            IsRunning     = false;

            Connection = RedisSettings.ConnectionFactory();
            Database   = Connection.GetDatabase();

            if (RedisSettings.AutoStartConsumers)
            {
                Start().Wait();
            }
        }
Ejemplo n.º 20
0
        private static void AssertSettings(MessageBusSettings settings)
        {
            Assert.IsTrue(settings.Serializer != null,
                          () => new InvalidConfigurationMessageBusException($"{nameof(MessageBusSettings.Serializer)} was not set on {nameof(MessageBusSettings)} object"));

            Assert.IsTrue(settings.DependencyResolver != null,
                          () => new InvalidConfigurationMessageBusException($"{nameof(MessageBusSettings.DependencyResolver)} was not set on {nameof(MessageBusSettings)} object"));

            if (settings.RequestResponse != null)
            {
                Assert.IsTrue(settings.RequestResponse.Topic != null,
                              () => new InvalidConfigurationMessageBusException($"Request-response: topic was not set"));
            }
        }
        public KafkaMessageBus(MessageBusSettings settings, KafkaMessageBusSettings kafkaSettings)
            : base(settings)
        {
            AssertSettings(settings);

            KafkaSettings = kafkaSettings;

            CreateProducer();
            CreateGroupConsumers(settings);
            CreateProviders();

            // TODO: Auto start should be a setting
            Start();
        }
Ejemplo n.º 22
0
        protected MessageBusBase(MessageBusSettings settings)
        {
            AssertSettings(settings);

            Settings = settings;
            PublisherSettingsByMessageType = settings.Publishers.ToDictionary(x => x.MessageType);

            PendingRequestStore = new InMemoryPendingRequestStore();
            PendingRequestTimer = new Timer
            {
                Interval  = 1000,
                AutoReset = true
            };
            PendingRequestTimer.Elapsed += CleanPendingRequests;
            PendingRequestTimer.Start();
        }
Ejemplo n.º 23
0
        protected MessageBusBase(MessageBusSettings settings)
        {
            AssertSettings(settings);

            Settings = settings;
            PublisherSettingsByMessageType = settings.Publishers.ToDictionary(x => x.MessageType);

            PendingRequestStore   = new InMemoryPendingRequestStore();
            PendingRequestManager = new PendingRequestManager(PendingRequestStore, () => CurrentTime, TimeSpan.FromSeconds(1), request =>
            {
                // Execute the event hook
                // ToDo: sort out the ConsumerSettings arg for req/resp, for now pass null
                (Settings.RequestResponse.OnMessageExpired ?? Settings.OnMessageExpired)?.Invoke(null, request);
            });
            PendingRequestManager.Start();
        }
Ejemplo n.º 24
0
        public MessageBusMock()
        {
            ConsumerMock = new Mock <IConsumer <SomeMessage> >();
            HandlerMock  = new Mock <IRequestHandler <SomeRequest, SomeResponse> >();

            ChildDependencyResolverMocks = new List <Mock <IDependencyResolver> >();

            void SetupDependencyResolver(Mock <IDependencyResolver> mock)
            {
                mock.Setup(x => x.Resolve(typeof(IConsumer <SomeMessage>))).Returns(ConsumerMock.Object);
                mock.Setup(x => x.Resolve(typeof(IRequestHandler <SomeRequest, SomeResponse>))).Returns(HandlerMock.Object);
            }

            DependencyResolverMock = new Mock <IDependencyResolver>();
            SetupDependencyResolver(DependencyResolverMock);
            DependencyResolverMock.Setup(x => x.CreateScope()).Returns(() =>
            {
                var mock = new Mock <IDependencyResolver>();
                SetupDependencyResolver(mock);

                ChildDependencyResolverMocks.Add(mock);

                OnChildDependencyResolverCreated?.Invoke(mock);

                mock.Setup(x => x.Dispose()).Callback(() =>
                {
                    ChildDependencyResolverMocks.Remove(mock);
                });

                return(mock.Object);
            });

            SerializerMock = new Mock <IMessageSerializer>();

            var mbSettings = new MessageBusSettings
            {
                DependencyResolver = DependencyResolverMock.Object,
                Serializer         = SerializerMock.Object
            };

            CurrentTime = DateTimeOffset.UtcNow;

            BusMock = new Mock <MessageBusBase>(mbSettings);
            BusMock.SetupGet(x => x.Settings).Returns(mbSettings);
            BusMock.SetupGet(x => x.CurrentTime).Returns(() => CurrentTime);
        }
Ejemplo n.º 25
0
        public MessageBusMock()
        {
            DependencyResolverMock = new Mock <IDependencyResolver>();

            SerializerMock = new Mock <IMessageSerializer>();

            BusSettings = new MessageBusSettings
            {
                DependencyResolver = DependencyResolverMock.Object,
                Serializer         = SerializerMock.Object
            };

            CurrentTime = DateTimeOffset.UtcNow;

            BusMock = new Mock <MessageBusBase>(BusSettings);
            BusMock.SetupGet(x => x.Settings).Returns(BusSettings);
            BusMock.SetupGet(x => x.CurrentTime).Returns(() => CurrentTime);
        }
        private void CreateGroupConsumers(MessageBusSettings settings)
        {
            Log.Info("Creating group consumers...");

            var responseConsumerCreated = false;

            Func <TopicPartition, IKafkaCommitController, IKafkaTopicPartitionProcessor> responseProcessorFactory =
                (tp, cc) => new KafkaResponseProcessor(settings.RequestResponse, tp, cc, this);

            foreach (var consumersByGroup in settings.Consumers.GroupBy(x => x.Group))
            {
                var group           = consumersByGroup.Key;
                var consumerByTopic = consumersByGroup.ToDictionary(x => x.Topic);

                Func <TopicPartition, IKafkaCommitController, IKafkaTopicPartitionProcessor> consumerProcessorFactory =
                    (tp, cc) => new KafkaConsumerProcessor(consumerByTopic[tp.Topic], tp, cc, this);

                var topics           = consumerByTopic.Keys.ToList();
                var processorFactory = consumerProcessorFactory;

                // if responses are used and shared with the regular consumers group
                if (settings.RequestResponse != null && group == settings.RequestResponse.Group)
                {
                    // Note: response topic cannot be used in consumer topics - this is enforced in AssertSettings method
                    topics.Add(settings.RequestResponse.Topic);

                    processorFactory = (tp, cc) => tp.Topic == settings.RequestResponse.Topic
                        ? responseProcessorFactory(tp, cc)
                        : consumerProcessorFactory(tp, cc);

                    responseConsumerCreated = true;
                }

                AddGroupConsumer(group, topics.ToArray(), processorFactory);
            }

            if (settings.RequestResponse != null && !responseConsumerCreated)
            {
                AddGroupConsumer(settings.RequestResponse.Group, new[] { settings.RequestResponse.Topic }, responseProcessorFactory);
            }

            Log.InfoFormat("Created {0} group consumers", _groupConsumers.Count);
        }
Ejemplo n.º 27
0
        public HybridMessageBus(MessageBusSettings settings, HybridMessageBusSettings providerSettings)
        {
            Settings         = settings;
            ProviderSettings = providerSettings;

            _routeByMessageType = new Dictionary <Type, string>();

            _busByName = new Dictionary <string, MessageBusBase>(providerSettings.Count);
            foreach (var name in providerSettings.Keys)
            {
                var builderFunc = providerSettings[name];

                var bus = BuildBus(builderFunc);

                _busByName.Add(name, bus);

                BuildAutoRouting(name, bus);
            }

            // ToDo: defer start of busses until here
        }
        public KafkaMessageBusTest()
        {
            var producerMock = new Mock <IProducer <byte[], byte[]> >();

            producerMock.SetupGet(x => x.Name).Returns("Producer Name");

            var producerBuilderMock = new Mock <ProducerBuilder <byte[], byte[]> >(new ProducerConfig());

            producerBuilderMock.Setup(x => x.Build()).Returns(producerMock.Object);

            MbSettings = new MessageBusSettings
            {
                Serializer         = new Mock <IMessageSerializer>().Object,
                DependencyResolver = new Mock <IDependencyResolver>().Object,
                LoggerFactory      = NullLoggerFactory.Instance
            };
            KafkaMbSettings = new KafkaMessageBusSettings("host")
            {
                ProducerBuilderFactory = (config) => producerBuilderMock.Object
            };
            KafkaMb = new Lazy <WrappedKafkaMessageBus>(() => new WrappedKafkaMessageBus(MbSettings, KafkaMbSettings));
        }
        public void BuildsProperSettings()
        {
            // arrange
            var topic    = "topic";
            var settings = new MessageBusSettings();

            // act
            var subject = new ConsumerBuilder <SomeMessage>(settings)
                          .Topic(topic)
                          .Instances(3)
                          .WithConsumer <SomeMessageConsumer>();

            // assert
            subject.ConsumerSettings.MessageType.Should().Be(typeof(SomeMessage));
            subject.MessageType.Should().Be(typeof(SomeMessage));
            subject.Topic.Should().Be(topic);
            subject.ConsumerSettings.Topic.Should().Be(topic);
            subject.ConsumerSettings.Instances.Should().Be(3);
            subject.ConsumerSettings.ConsumerType.Should().Be(typeof(SomeMessageConsumer));
            subject.ConsumerSettings.ConsumerMode.Should().Be(ConsumerMode.Consumer);
            subject.ConsumerSettings.IsRequestMessage.Should().BeFalse();
            subject.ConsumerSettings.ResponseType.Should().BeNull();
        }
Ejemplo n.º 30
0
        public MessageBusMock()
        {
            ConsumerMock = new Mock <IConsumer <SomeMessage> >();
            HandlerMock  = new Mock <IRequestHandler <SomeRequest, SomeResponse> >();

            DependencyResolverMock = new Mock <IDependencyResolver>();
            DependencyResolverMock.Setup(x => x.Resolve(typeof(IConsumer <SomeMessage>))).Returns(ConsumerMock.Object);
            DependencyResolverMock.Setup(x => x.Resolve(typeof(IRequestHandler <SomeRequest, SomeResponse>))).Returns(HandlerMock.Object);

            SerializerMock = new Mock <IMessageSerializer>();

            var mbSettings = new MessageBusSettings
            {
                DependencyResolver = DependencyResolverMock.Object,
                Serializer         = SerializerMock.Object
            };

            CurrentTime = DateTimeOffset.UtcNow;

            BusMock = new Mock <MessageBusBase>(mbSettings);
            BusMock.SetupGet(x => x.Settings).Returns(mbSettings);
            BusMock.SetupGet(x => x.CurrentTime).Returns(() => CurrentTime);
        }