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")); } }); }
public void Should_only_connect_once() { sut.Subscribe(eventConsumer); sut.Subscribe(eventConsumer); sut.Refresh(); sut.Dispose(); A.CallTo(() => eventConsumerInfoRepository.CreateAsync(consumerName)).MustHaveHappened(); }
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); }
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); } }