public void GetSubscriberForEvent_WhenNoSubscriptionStored_ReturnsNothing()
        {
            using var subscriptionFactory = new SubscriptionFactory();
            var testEventSubscription = subscriptionFactory.GetSubscriberForEvent <TestEvent>();

            Assert.IsNull(testEventSubscription, "testEventSubscription should be null");
        }
        public void GetSubscriberForEvent_WhenSubscriptionStored_ReturnsSubscription()
        {
            var subscriptionFactory = new SubscriptionFactory();
            var createdSubscription = subscriptionFactory.CreateSubscriberForEvent <TestEvent>();

            var testEventSubscription = subscriptionFactory.GetSubscriberForEvent <TestEvent>();

            Assert.AreSame(createdSubscription, testEventSubscription, "Subscription instances are not the same");
        }
        public void GivenMultipleInstances_Check_ReturnsCorrectSubscriptionFromInstance()
        {
            var subscriptionFactory = new SubscriptionFactory();
            var createdSubscription = subscriptionFactory.CreateSubscriberForEvent <TestEvent>();

            using var newSubscriptionFactory = new SubscriptionFactory();
            var newTestEventSubscription = newSubscriptionFactory.GetSubscriberForEvent <TestEvent>();

            Assert.IsNull(newTestEventSubscription, "newTestEventSubscription should be null");

            var newlyCreatedSubscription = newSubscriptionFactory.CreateSubscriberForEvent <TestEvent>();

            var testEventSubscription = subscriptionFactory.GetSubscriberForEvent <TestEvent>();

            Assert.AreSame(createdSubscription, testEventSubscription, "Subscription instances are not the same");
            Assert.AreNotSame(createdSubscription, newlyCreatedSubscription, "Subscription instances should not be same");
        }
示例#4
0
        public async Task OnMessageReceived(Message message)
        {
            var eventName = message.Label;

            var typeOfEvent = Type.GetType(eventName);

            try
            {
                var provider            = _serviceScopeFactory.CreateScope().ServiceProvider;
                var messageBody         = Encoding.UTF8.GetString(message.Body);
                var authenticationToken = (string)message.UserProperties["AuthenticationToken"];
                var userName            = (string)message.UserProperties["User"];

                _log.Event($"Received Message {eventName}", new Dictionary <string, string>
                {
                    { "MessageId", message.MessageId },
                    { "User", userName },
                    { "MessageBody", messageBody }
                });

                SetAuthenticationToken();

                var subscriberInfos = _subscriptionFactory.GetSubscriberForEvent(eventName)?.EventSubscribers;

                if (!subscriberInfos?.Any() ?? false)
                {
                    _log.Warn($"No subscribers found for {eventName}");
                    return;
                }

                var handleTasks = new List <Task>();

                foreach (var subscriberInfo in subscriberInfos)
                {
                    var eventSubscribers = provider.GetServices(subscriberInfo.Type).ToArray();

                    if (!eventSubscribers.Any())
                    {
                        _log.Warn($"No types registered as {subscriberInfo.Type}");
                        continue;
                    }

                    var eventData = FromJson <object>(messageBody);

                    var handleMethod = subscriberInfo.Type.GetMethod("Handle", new[] { subscriberInfo.EventType });

                    foreach (var eventSubscriber in eventSubscribers)
                    {
                        var handleTask = (Task)handleMethod.Invoke(eventSubscriber, new[] { eventData });
                        handleTasks.Add(handleTask);

#pragma warning disable 4014
                        handleTask.ContinueWith(task =>
#pragma warning restore 4014
                        {
                            if (handleTask.IsFaulted)
                            {
                                var aggException = handleTask.Exception;
                                _log.Error(new Exception("Handle Task Exception -> " + aggException.Message));
                                aggException.Handle(hndExp =>
                                {
                                    _log.Error(hndExp, new Dictionary <string, string> {
                                        { "Handler", eventSubscriber.ToString() },
                                        { "SubscriberType", subscriberInfo.Type.FullName },
                                        { "EventType", subscriberInfo.EventType.FullName }
                                    });

                                    return(true);
                                });
                            }
                        }, TaskContinuationOptions.OnlyOnFaulted);
                    }
                }

                await Task.WhenAll(handleTasks);

                void SetAuthenticationToken()
                {
                    var tokenValidators = provider.GetServices <UserFromAuthenticationToken>();

                    foreach (var tokenValidator in tokenValidators)
                    {
                        var validUser = tokenValidator.ReadUserFromToken(authenticationToken);

                        _log.Info($"Authentication token validation result is {validUser} " +
                                  $"for User {tokenValidator.GetUser()?.LoginName}");
                    }
                }
            }
            catch (Exception ex)
            {
                _log.Error(ex);

                _log.Warn(ex.Message);
                _log.Error(ex, new Dictionary <string, string>
                {
                    { "EventName", eventName },
                    { "MessageId", message.MessageId }
                });

                throw;
            }
        }