public async Task QueueMessageBatchAsync <T>(Guid streamGuid, string streamNamespace, IEnumerable <T> events, StreamSequenceToken token, Dictionary <string, object> requestContext)
        {
            if (token != null)
            {
                throw new NotImplementedException("EventHub stream provider currently does not support non-null StreamSequenceToken.");
            }

            var cnt = events.Count();

            if (cnt == 0)
            {
                return;
            }

            KafkaEventBusBatchContainer batch = new KafkaEventBusBatchContainer();

            byte[] val = null;
            byte[] key = null;
            if (events is IEnumerable <DomainEvent> des)
            {
                if (cnt > 1)
                {
                    throw new NotSupportedException("DomainEvent should only produce one by one");
                }
                var aid = des.First().AggregateId;
                if (string.IsNullOrEmpty(aid))
                {
                    throw new NotSupportedException("DomainEvent must have aggregate id");
                }

                key          = Encoding.UTF8.GetBytes(aid);
                batch.Events = des.Select(de => de.Event).ToList();
            }
            else if (events is IEnumerable <IntegrationEvent> ies)
            {
                key          = null;
                batch.Events = ies.Select(ie => ie.Event).ToList();
            }
            else
            {
                throw new NotSupportedException("Only support DomainEvent or IntegrationEvent");
            }

            var output     = new OutputBuffer();
            var bondWriter = new SimpleBinaryWriter <OutputBuffer>(output);

            serializer.Serialize(batch, bondWriter);
            val = output.Data.ToArray();

            var msg = await this.producer.ProduceAsync(streamNamespace, key, val);

            if (msg.Error.HasError)
            {
                // handle err
                // already throwed
                //throw new Confluent.Kafka.KafkaException(msg.Error);
            }
        }
        public Task <IList <IBatchContainer> > GetQueueMessagesAsync(int maxCount)
        {
            if (consumer == null || consumer.Subscription.Count == 0)
            {
                return(Task.FromResult(empty));
            }
            List <Message> msgs = new List <Message>();

            while (true)
            {
                consumer.Consume(out var msg, 50);

                if (msg == null || msg.Error.Code == ErrorCode.Local_PartitionEOF)
                {
                    break;
                }

                if (!msg.Error.HasError)
                {
                    msgs.Add(msg);
                    if (maxCount != QueueAdapterConstants.UNLIMITED_GET_QUEUE_MSG && msgs.Count >= maxCount)
                    {
                        break;
                    }
                }
                else
                {
                    // handle
                    break;
                }
            }

            IList <IBatchContainer> batches = new List <IBatchContainer>();

            foreach (var msg in msgs)
            {
                IBatchContainer container = KafkaEventBusBatchContainer.FromKafkaMessage(msg, deserializer, lastReadMessage++);

                batches.Add(container);
            }

            return(Task.FromResult(batches));
        }
Esempio n. 3
0
        public static KafkaEventBusBatchContainer FromKafkaMessage(Message msg, SerializationManager serializationManager, long seqNumber)
        {
            var container   = new KafkaEventBusBatchContainer();
            var events      = serializationManager.DeserializeFromByteArray <List <Event> >(msg.Value);
            var aggIdString = msg.Key == null ? null : Encoding.UTF8.GetString(msg.Key);

            if (string.IsNullOrEmpty(aggIdString) && Guid.TryParse(aggIdString, out var guid))
            {
                container.StreamGuid = guid;
            }
            else
            {
                container.StreamGuid = new Guid(msg.Partition, 0, 0, zero8);
            }

            container.StreamNamespace    = msg.Topic;
            container.EventSequenceToken = new EventSequenceToken(seqNumber);
            container.Events             = events;

            container.TopicPartitionOffset = msg.TopicPartitionOffset;

            return(container);
        }