Exemplo n.º 1
0
        private async void FetchMessages(CancellationToken token, Func <IEvent, Task> dispatcher, Action <Exception> onError, Action onCompleted, IMessageReader reader, long from)
        {
            var current = from;

            while (!token.IsCancellationRequested)
            {
                IMessageResult result;
                try
                {
                    result = await reader.GetMessagesAsync(token, current, 500);
                }
                catch (Exception e)
                {
                    onError(e);
                    token.WaitHandle.WaitOne(1000 * 20);
                    continue;
                }

                if (result.HasMessages())
                {
                    foreach (var message in result.Messages)
                    {
                        _infoLogger(string.Format("Received message {1} on stream {0}", _stream, message));
                        IEvent @event;
                        try
                        {
                            @event = _deserializer(message.Value);
                            _infoLogger(string.Format("Received event {1} on stream {0}", _stream, @event.GetType()));
                        }
                        catch (Exception e)
                        {
                            onError(e);
                            continue;
                        }
                        await dispatcher(@event);
                    }
                    current = result.NextOffset;
                    _checkpointWriter.Update(current);
                }
            }

            onCompleted();
        }