示例#1
0
        /// <summary>
        /// Adds committable offset to existing ones
        /// </summary>
        private ICommittableOffsetBatch UpdateWithOffset(ICommittableOffset committableOffset)
        {
            var partitionOffset = committableOffset.Offset;
            var metadata        = (committableOffset is ICommittableOffsetMetadata withMetadata) ? withMetadata.Metadata : string.Empty;

            var newOffsets = OffsetsAndMetadata.SetItem(partitionOffset.GroupTopicPartition, new OffsetAndMetadata(partitionOffset.Offset, metadata));
            var committer  = committableOffset is CommittableOffset c
                ? c.Committer
                : throw new ArgumentException($"Unknown committable offset, got {committableOffset.GetType().Name}, expected {nameof(committableOffset)}");


            IImmutableDictionary <string, IInternalCommitter> newCommitters = ImmutableDictionary <string, IInternalCommitter> .Empty;

            if (Committers.TryGetValue(partitionOffset.GroupId, out var groupCommitter))
            {
                if (!groupCommitter.Equals(committer))
                {
                    throw new ArgumentException($"CommittableOffset {committableOffset} committer for groupId {partitionOffset.GroupId} " +
                                                $"must be same as the other with this groupId.");
                }

                newCommitters = Committers;
            }
            else
            {
                newCommitters = Committers.SetItem(partitionOffset.GroupId, committer);
            }

            return(new CommittableOffsetBatch(newOffsets, newCommitters, BatchSize + 1));
        }
示例#2
0
        /// <inheritdoc />
        public async Task Commit()
        {
            if (Offsets.IsEmpty() || Committers.IsEmpty())
            {
                return;
            }

            await Committers.First().Value.Commit(this);
        }