示例#1
0
        public async Task throw_when_subscribe_and_already_subscribing()
        {
            var cts = new CancellationTokenSource(10000);
            var mockSubscriptionListener = new Mock <ISubscriptionListener>();
            var mockResolutionManager    = new Mock <IResolutionManager>();
            var mockSortingManager       = new Mock <ISortingManager>();
            var mockHandlingManager      = new Mock <IHandlingManager>();
            var mockStreamClient         = new Mock <IStreamClient>();
            var regionId1 = "r1";
            var regionId2 = "r2";
            var streamId  = "s";
            var options   = new SubscriberOptions(new List <SubscriptionStreamId>()
            {
                new SubscriptionStreamId(regionId1, streamId),
                new SubscriptionStreamId(regionId2, streamId)
            });
            var subscriber  = new Subscriber(NullStandardLogger.Instance, null, mockSubscriptionListener.Object, mockResolutionManager.Object, mockSortingManager.Object, mockHandlingManager.Object, null, options);
            var mockAwaiter = new ManualResetEventSlim(false);

            mockSubscriptionListener.Setup(x => x.ListenAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <CancellationToken>())).Returns(mockAwaiter.WaitHandle.AsTask());
            mockResolutionManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Returns(mockAwaiter.WaitHandle.AsTask());
            mockSortingManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Returns(mockAwaiter.WaitHandle.AsTask());
            mockHandlingManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Returns(mockAwaiter.WaitHandle.AsTask());

            var subscribeTask = subscriber.SubscribeAsync(cts.Token);

            await Assert.ThrowsAsync <InvalidOperationException>(() => subscriber.SubscribeAsync(cts.Token));

            cts.Cancel();
            await subscribeTask;
        }
        public void Init_And_Update_With_Generic_Options()
        {
            var unsub  = new Func <SubscriptionToken, bool>(_ => true);
            var action = new Action <string>((t) =>
            {
            });

            var token        = new SubscriptionToken(unsub);
            var weakAction   = new WeakDelegate(action, false);
            var subscription = new Subscriber <string>(token, synchronizationContext, weakAction);
            var options      = new SubscriberOptions <string>(subscription);

            Assert.AreEqual(token, options.Token);
            //
            Assert.AreEqual(ExecutionStrategyType.PublisherThread, subscription.ExecutionStrategy);
            options.WithExecutionStrategy(ExecutionStrategyType.UIThread);

            Assert.AreEqual(ExecutionStrategyType.UIThread, subscription.ExecutionStrategy);

            //
            Assert.IsNotNull(subscription.Filter);

            var newFilter = new Func <string, bool>(_ => true);

            options.WithFilter(newFilter);

            Assert.AreEqual("MvvmLib.Core.Tests.Message.SubscriberOptionsTests+<>c", subscription.Filter.Target.GetType().FullName);
        }
示例#3
0
 private void ViewBagSchedule()
 {
     ViewBag.MonthRange = SubscriberOptions.Month();
     ViewBag.WeekRange  = SubscriberOptions.DayInWeek();
     ViewBag.DayRange   = SubscriberOptions.Day();
     ViewBag.HourRange  = SubscriberOptions.Hour();
 }
        public void construct()
        {
            var subscriptionStreamIds = new List <SubscriptionStreamId>();

            var options = new SubscriberOptions(subscriptionStreamIds);

            Assert.Equal(subscriptionStreamIds, options.SubscriptionStreamIds);
        }
示例#5
0
        public void OnNavigatingTo(NavigationContext navigationContext)
        {
            SetTitle();

            PeopleListSource.SelectedItemChanged += OnDetailsSourceSelectedItemChanged;
            this.PersonAddedSubscriberOptions     = eventAggregator.GetEvent <PersonAddedEvent>().Subscribe(OnPersonAdded);
            this.PersonUpdatedSubscriberOptions   = eventAggregator.GetEvent <PersonUpdatedSuccesfullyEvent>().Subscribe(OnPersonUpdated);
            Load();
        }
示例#6
0
        public async Task clear_stream_state_errors()
        {
            var mockStreamStateRepo = new Mock <IStreamStateRepo>();
            var options             = new SubscriberOptions(new List <SubscriptionStreamId>());
            var subscriber          = new Subscriber(NullStandardLogger.Instance, null, null, null, null, null, mockStreamStateRepo.Object, options);

            await subscriber.ClearStreamStateErrorsAsync();

            mockStreamStateRepo.Verify(x => x.ClearStreamStateErrorsAsync());
        }
示例#7
0
 internal Subscriber(Subscription subscription, Func <ReadOnlyMemory <Message>, CancellationToken, Task> pushHandler, long completedMessageId,
                     SubscriberOptions subscriberOptions)
 {
     this.subscription        = subscription;
     this.topic               = subscription.Topic;
     this.pushHandler         = pushHandler;
     sentMessageId            = completedMessageId;
     maxMessagesInBatch       = subscriberOptions.MaxMessagesInBatch;
     pushIntervalMilliseconds = subscriberOptions.PushIntervalMilliseconds;
     cancellationTokenSource  = new CancellationTokenSource();
 }
示例#8
0
        private void ViewBagTask()
        {
            var first = Enumerable.Range(1, 1)
                        .Select(s => new SelectListItem {
                Value = "", Text = "-----"
            });

            var scheduleRange = SubscriberOptions.Schedule();

            ViewBag.ScheduleRange = first.Union(scheduleRange);
        }
示例#9
0
        public async Task listen_and_start_managers_until_cancelled()
        {
            var cts = new CancellationTokenSource();
            var mockSubscriptionListener = new Mock <ISubscriptionListener>();
            var mockResolutionManager    = new Mock <IResolutionManager>();
            var mockSortingManager       = new Mock <ISortingManager>();
            var mockHandlingManager      = new Mock <IHandlingManager>();
            var mockStreamClient         = new Mock <IStreamClient>();
            var regionId = "r";
            var streamId = "s";
            var options  = new SubscriberOptions(new List <SubscriptionStreamId>()
            {
                new SubscriptionStreamId(regionId, streamId)
            });

            var mockAwaiter              = new ManualResetEventSlim(false);
            var listeningSignal          = new ManualResetEventSlim(false);
            var resolutionManagingSignal = new ManualResetEventSlim(false);
            var sortingManagingSignal    = new ManualResetEventSlim(false);
            var handlingManagingSignal   = new ManualResetEventSlim(false);

            mockSubscriptionListener.Setup(x => x.ListenAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <CancellationToken>())).Callback(() => listeningSignal.Set()).Returns(mockAwaiter.WaitHandle.AsTask());
            mockResolutionManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Callback(() => resolutionManagingSignal.Set()).Returns(mockAwaiter.WaitHandle.AsTask());
            mockSortingManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Callback(() => sortingManagingSignal.Set()).Returns(mockAwaiter.WaitHandle.AsTask());
            mockHandlingManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Callback(() => handlingManagingSignal.Set()).Returns(mockAwaiter.WaitHandle.AsTask());

            var subscriber = new Subscriber(NullStandardLogger.Instance, null, mockSubscriptionListener.Object, mockResolutionManager.Object, mockSortingManager.Object, mockHandlingManager.Object, null, options);

            var subscribeTask = subscriber.SubscribeAsync(cts.Token);

            var timeoutToken1 = new CancellationTokenSource(10000).Token;
            await Task.WhenAny(new[] { Task.WhenAll(new[] { listeningSignal.WaitHandle.AsTask(), resolutionManagingSignal.WaitHandle.AsTask(), sortingManagingSignal.WaitHandle.AsTask(), handlingManagingSignal.WaitHandle.AsTask() }), timeoutToken1.WaitHandle.AsTask() });

            if (timeoutToken1.IsCancellationRequested)
            {
                throw new TimeoutException();
            }

            mockSubscriptionListener.Verify(x => x.ListenAsync(regionId, streamId, cts.Token));
            mockResolutionManager.Verify(x => x.ManageAsync(cts.Token));
            mockSortingManager.Verify(x => x.ManageAsync(cts.Token));
            mockHandlingManager.Verify(x => x.ManageAsync(cts.Token));

            cts.Cancel();

            var timeoutToken2 = new CancellationTokenSource(10000).Token;
            await Task.WhenAny(new[] { subscribeTask, timeoutToken2.WaitHandle.AsTask() });

            if (timeoutToken2.IsCancellationRequested)
            {
                throw new TimeoutException();
            }
        }
示例#10
0
        public async Task throw_exception_when_subscribing()
        {
            var cts = new CancellationTokenSource(10000);
            var mockSubscriptionListener = new Mock <ISubscriptionListener>();
            var mockResolutionManager    = new Mock <IResolutionManager>();
            var mockSortingManager       = new Mock <ISortingManager>();
            var mockHandlingManager      = new Mock <IHandlingManager>();
            var mockStreamClient         = new Mock <IStreamClient>();
            var options    = new SubscriberOptions(new List <SubscriptionStreamId>());
            var subscriber = new Subscriber(NullStandardLogger.Instance, null, mockSubscriptionListener.Object, mockResolutionManager.Object, mockSortingManager.Object, mockHandlingManager.Object, null, options);

            mockResolutionManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Throws(new TestException());
            mockSortingManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Returns(Task.CompletedTask);
            mockHandlingManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Returns(Task.CompletedTask);

            await Assert.ThrowsAsync <TestException>(() => subscriber.SubscribeAsync(cts.Token));
        }
        public void Init_And_Update()
        {
            var unsub  = new Func <SubscriptionToken, bool>(_ => true);
            var action = new Action(() =>
            {
            });

            var token        = new SubscriptionToken(unsub);
            var weakAction   = new WeakDelegate(action, false);
            var subscription = new Subscriber(token, synchronizationContext, weakAction);
            var options      = new SubscriberOptions(subscription);

            Assert.AreEqual(token, options.Token);
            //
            Assert.AreEqual(ExecutionStrategyType.PublisherThread, subscription.ExecutionStrategy);
            options.WithExecutionStrategy(ExecutionStrategyType.UIThread);

            Assert.AreEqual(ExecutionStrategyType.UIThread, subscription.ExecutionStrategy);
        }
示例#12
0
        public async Task subscribe_to_multiple_regions()
        {
            var cts = new CancellationTokenSource(10000);
            var mockSubscriptionListener = new Mock <ISubscriptionListener>();
            var mockResolutionManager    = new Mock <IResolutionManager>();
            var mockSortingManager       = new Mock <ISortingManager>();
            var mockHandlingManager      = new Mock <IHandlingManager>();
            var mockStreamClient         = new Mock <IStreamClient>();
            var regionId1 = "r1";
            var regionId2 = "r2";
            var streamId  = "s";
            var options   = new SubscriberOptions(new List <SubscriptionStreamId>()
            {
                new SubscriptionStreamId(regionId1, streamId),
                new SubscriptionStreamId(regionId2, streamId)
            });
            var subscriber               = new Subscriber(NullStandardLogger.Instance, null, mockSubscriptionListener.Object, mockResolutionManager.Object, mockSortingManager.Object, mockHandlingManager.Object, null, options);
            var mockAwaiter              = new ManualResetEventSlim(false);
            var listeningSignal          = new ManualResetEventSlim(false);
            var resolutionManagingSignal = new ManualResetEventSlim(false);
            var sortingManagingSignal    = new ManualResetEventSlim(false);
            var handlingManagingSignal   = new ManualResetEventSlim(false);

            mockSubscriptionListener.Setup(x => x.ListenAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <CancellationToken>())).Returns(Task.CompletedTask);
            mockResolutionManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Returns(Task.CompletedTask);
            mockSortingManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Returns(Task.CompletedTask);
            mockHandlingManager.Setup(x => x.ManageAsync(It.IsAny <CancellationToken>())).Returns(Task.CompletedTask);

            await subscriber.SubscribeAsync(cts.Token);

            if (cts.IsCancellationRequested)
            {
                throw new TimeoutException();
            }

            mockSubscriptionListener.Verify(x => x.ListenAsync(regionId1, streamId, cts.Token));
            mockSubscriptionListener.Verify(x => x.ListenAsync(regionId2, streamId, cts.Token));
        }
示例#13
0
        internal Subscriber CreateSubscriber(Func <ReadOnlyMemory <Message>, CancellationToken, Task> push, SubscriberOptions subscriberOptions)
        {
            lock (sync)
            {
                if (subscriber != null)
                {
                    throw new SubscriptionManagementException($"Subscription {name} is already used");
                }

                subscriber = new Subscriber(this, push, completedMessageId, subscriberOptions);
                subscriber.StartPushLoop();
                return(subscriber);
            }
        }
示例#14
0
        private void InitSubscriber()
        {
            var taskParameters = Task.Subscriber.Parameters;

            switch (Task.Subscriber.Type.ToUpper())
            {
            case "KAFKA":
            {
                taskParameters.EnsureValue(nameof(KafkaOptions.Servers), out string services);
                taskParameters.EnsureValue(nameof(KafkaOptions.Servers), out string topic);
                KafkaOptions kafkaOptions = new KafkaOptions
                {
                    Servers = services,
                    Topic   = topic,
                    Config  = Task.Subscriber.Parameters
                };
                Task.Subscriber.Instance =
                    new KafkaSubscriber(kafkaOptions, _loggerFactory.CreateLogger <KafkaSubscriber>());
                break;
            }

            case "RABBITMQ":
            {
                taskParameters.EnsureValue(nameof(SubscriberOptions.HostName), out string hostName);
                taskParameters.EnsureValue(nameof(SubscriberOptions.UserName), out string userName);
                taskParameters.EnsureValue(nameof(SubscriberOptions.Password), out string password);
                taskParameters.EnsureValue(nameof(SubscriberOptions.RoutingKey), out string routerKey);
                taskParameters.EnsureValue(nameof(SubscriberOptions.QueueName), out string queueName);
                taskParameters.EnsureValue(nameof(SubscriberOptions.Exchange), out string exchange);
                SubscriberOptions rabbitMqOptions = new SubscriberOptions
                {
                    HostName   = hostName,
                    UserName   = userName,
                    Password   = password,
                    RoutingKey = routerKey,
                    QueueName  = queueName,
                    Exchange   = exchange
                };
                if (taskParameters.Value(nameof(SubscriberOptions.VirtualHost), out String virtualHost))
                {
                    rabbitMqOptions.VirtualHost = virtualHost;
                }

                if (taskParameters.Value(nameof(SubscriberOptions.ExchangeType), out String exchangeType))
                {
                    rabbitMqOptions.ExchangeType = exchangeType;
                }

                if (taskParameters.Value(nameof(SubscriberOptions.RequestedHeartbeat),
                                         out ushort requestedHeartbeat))
                {
                    rabbitMqOptions.RequestedHeartbeat = requestedHeartbeat;
                }

                if (taskParameters.Value(nameof(SubscriberOptions.AutomaticRecoveryEnabled),
                                         out bool automaticRecoveryEnabled))
                {
                    rabbitMqOptions.AutomaticRecoveryEnabled = automaticRecoveryEnabled;
                }

                Task.Subscriber.Instance = new RabbitMQSubscriber(_loggerFactory.CreateLogger <RabbitMQSubscriber>()
                                                                  , rabbitMqOptions
                                                                  , new PersistentConnection(rabbitMqOptions,
                                                                                             _loggerFactory.CreateLogger <PersistentConnection>()
                                                                                             ));
                break;
            }

            default:
            {
                throw new ArgumentException($"Can not support Subscriber.Type:[{Task.Subscriber.Type}].");
            }
            }
        }
示例#15
0
 public SubscriberOptions(SubscriberOptions options)
 {
     PushIntervalMilliseconds = options.PushIntervalMilliseconds;
     MaxMessagesInBatch       = options.MaxMessagesInBatch;
 }