Пример #1
0
        public void Subscribe(IEventConsumer eventConsumer)
        {
            Guard.NotNull(eventConsumer, nameof(eventConsumer));

            ThrowIfDisposed();

            if (timer != null)
            {
                return;
            }

            var consumerName    = eventConsumer.Name;
            var consumerStarted = false;

            timer = new CompletionTimer(5000, async ct =>
            {
                if (!consumerStarted)
                {
                    await eventConsumerInfoRepository.CreateAsync(consumerName);

                    consumerStarted = true;
                }

                try
                {
                    var status = await eventConsumerInfoRepository.FindAsync(consumerName);

                    var position = status.Position;

                    if (status.IsResetting)
                    {
                        currentSubscription?.Dispose();
                        currentSubscription = null;

                        position = null;

                        await ResetAsync(eventConsumer);
                    }
                    else if (status.IsStopped)
                    {
                        currentSubscription?.Dispose();
                        currentSubscription = null;

                        return;
                    }

                    if (currentSubscription == null)
                    {
                        await SubscribeAsync(eventConsumer, position);
                    }
                }
                catch (Exception ex)
                {
                    log.LogFatal(ex, w => w.WriteProperty("action", "EventHandlingFailed"));
                }
            });
        }
Пример #2
0
        public void Should_only_connect_once()
        {
            sut.Subscribe(eventConsumer);
            sut.Subscribe(eventConsumer);
            sut.Refresh();
            sut.Dispose();

            A.CallTo(() => eventConsumerInfoRepository.CreateAsync(consumerName)).MustHaveHappened();
        }
Пример #3
0
        public void Subscribe(IEventConsumer eventConsumer, int delay = 5000)
        {
            Guard.NotNull(eventConsumer, nameof(eventConsumer));

            ThrowIfDisposed();

            if (timer != null)
            {
                return;
            }

            var consumerName    = eventConsumer.Name;
            var consumerStarted = false;

            timer = new CompletionTimer(delay, async ct =>
            {
                if (!consumerStarted)
                {
                    await eventConsumerInfoRepository.CreateAsync(consumerName);

                    consumerStarted = true;
                }

                try
                {
                    var status = await eventConsumerInfoRepository.FindAsync(consumerName);

                    var position = status.Position;

                    if (status.IsResetting)
                    {
                        position = null;

                        await ResetAsync(eventConsumer, consumerName, position);
                    }
                    else if (status.IsStopped)
                    {
                        return;
                    }

                    await eventStore.GetEventsAsync(se =>
                    {
                        return(HandleEventAsync(eventConsumer, se, consumerName));
                    }, ct, eventConsumer.EventsFilter, position);
                }
                catch (Exception ex)
                {
                    log.LogFatal(ex, w => w.WriteProperty("action", "EventHandlingFailed"));

                    await eventConsumerInfoRepository.StopAsync(consumerName, ex.ToString());
                }
            });

            eventNotifier.Subscribe(timer.Trigger);
        }
Пример #4
0
        private async Task HandleAsync(object input)
        {
            try
            {
                if (!isStarted)
                {
                    await eventConsumerInfoRepository.CreateAsync(eventConsumer.Name);

                    isStarted = true;
                }

                var status = await eventConsumerInfoRepository.FindAsync(eventConsumer.Name);

                var lastReceivedEventNumber = status.LastHandledEventNumber;

                if (status.IsResetting)
                {
                    await ResetAsync();

                    Reset();
                }

                if (!status.IsStopped || !isRunning)
                {
                    var ct = new CancellationTokenSource();

                    await eventStore.GetEventsAsync(async storedEvent =>
                    {
                        if (!isRunning)
                        {
                            ct.Cancel();
                        }

                        var onEvent = OnEvent;

                        if (onEvent != null)
                        {
                            await onEvent(storedEvent);
                        }
                    }, ct.Token, null, lastReceivedEventNumber);
                }
            }
            catch (OperationCanceledException)
            {
            }
            catch (Exception ex)
            {
                OnError?.Invoke(ex);
            }
        }