Beispiel #1
0
        public async Task ProcessEventsAsync(PartitionContext context, IEnumerable <EventData> messages)
        {
            TaskMarker.OnStarted();
            try
            {
                EventData lastMessage           = null;
                EventData lastCheckpointMessage = null;
                var       skipLastCheckpoint    = false;

                foreach (var message in messages)
                {
                    if (!TaskMarker.CanRun)
                    {
                        break;
                    }

                    lastMessage = message;
                    if (OnSubmit(message, context))
                    {
                        lastCheckpointMessage = await CheckpointSafe(message, context);

                        if (!ReferenceEquals(lastCheckpointMessage, message))
                        {
                            // something went wrong (not all messages were processed with success)

                            // ToDo: add retry support
                            //skipLastCheckpoint = !ReferenceEquals(lastCheckpointMessage, message);
                            //skipLastCheckpoint = false;
                        }
                    }
                }

                if (!skipLastCheckpoint)
                {
                    // checkpoint the last messages
                    if ((!ReferenceEquals(lastCheckpointMessage, lastMessage) && lastMessage != null))
                    {
                        await CheckpointSafe(lastMessage, context);
                    }
                }
            }
            finally
            {
                TaskMarker.OnFinished();
            }
        }