Esempio n. 1
0
        protected async Task Handler(ReceivedEvent re, CancellationToken cancellationToken)
        {
            _debugLog?.Invoke(
                "Subscription {Subscription} got an event {EventType}",
                SubscriptionId,
                re.EventType
                );

            _lastProcessed = GetPosition(re);

            if (re.EventType.StartsWith("$") || re.Data.IsEmpty)
            {
                await Store();

                return;
            }

            try {
                var contentType = string.IsNullOrWhiteSpace(re.ContentType) ? "application/json" : re.ContentType;

                if (contentType != _eventSerializer.ContentType)
                {
                    throw new InvalidOperationException($"Unknown content type {contentType}");
                }

                object?evt;

                try {
                    evt = _eventSerializer.Deserialize(re.Data.Span, re.EventType);
                }
                catch (Exception e) {
                    _log?.LogError(
                        e,
                        "Error deserializing event {Strean} {Position} {Type}",
                        re.OriginalStream,
                        re.StreamPosition,
                        re.EventType
                        );

                    throw;
                }

                if (evt != null)
                {
                    await Task.WhenAll(
                        _eventHandlers.Select(x => x.HandleEvent(evt, (long?)re.GlobalPosition, cancellationToken))
                        );
                }
            }
            catch (Exception e) {
                _log?.LogWarning(
                    e,
                    "Error when handling the event {Strean} {Position} {Type}",
                    re.OriginalStream,
                    re.StreamPosition,
                    re.EventType
                    );
            }

            await Store();

            Task Store() => StoreCheckpoint(GetPosition(re), cancellationToken);
Esempio n. 2
0
 static EventPosition GetPosition(ReceivedEvent receivedEvent)
 => new(receivedEvent.StreamPosition, receivedEvent.Created);