Exemple #1
0
        public async Task ConsumeAsync(string eventType, ResolvedEvent resolvedEvent)
        {
            if (string.IsNullOrWhiteSpace(eventType))
            {
                throw new ArgumentException("Event type required", nameof(eventType));
            }

            if (_settings.ReadOnly)
            {
                _logger.Debug("Received {EventType} #{EventNumber} from {StreamName} (Original Event: #{OriginalEventNumber})",
                              resolvedEvent.Event.EventType,
                              resolvedEvent.Event.EventNumber,
                              resolvedEvent.Event.EventStreamId,
                              resolvedEvent.OriginalEventNumber
                              );

                return;
            }

            var eventData = new EventData(
                resolvedEvent.Event.EventId,
                resolvedEvent.Event.EventType,
                true,
                resolvedEvent.Event.Data,
                resolvedEvent.Event.Metadata
                );

            WriteResult result = default;

            using (_logger.OperationAt(LogEventLevel.Debug).Time("Replicating {EventType} #{EventNumber} from {StreamName} (Original Event: #{OriginalEventNumber})",
                                                                 resolvedEvent.Event.EventType,
                                                                 resolvedEvent.Event.EventNumber,
                                                                 resolvedEvent.Event.EventStreamId,
                                                                 resolvedEvent.OriginalEventNumber))
                using (DittoMetrics.IODuration.WithIOLabels("eventstore", "ditto-destination", "append_to_stream").NewTimer())
                {
                    result = await _connection.AppendToStreamAsync(
                        resolvedEvent.Event.EventStreamId,
                        _settings.SkipVersionCheck?ExpectedVersion.Any : resolvedEvent.Event.EventNumber - 1,
                        eventData
                        );
                }

            if (_ttl && result.NextExpectedVersion == 0) // New stream created
            {
                await SetStreamMetadataAsync(resolvedEvent.Event.EventStreamId);
            }

            if (_settings.ReplicationThrottleInterval.GetValueOrDefault() > 0)
            {
                await Task.Delay(_settings.ReplicationThrottleInterval.Value);
            }
        }