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)); }
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); }