public void ShouldSerializeKafkaApplicationException()
        {
            var expected = new KafkaApplicationException("3")
            {
                ErrorCode = 1
            };
            var actual = SerializeDeserialize(expected);

            Assert.AreEqual(expected.ErrorCode, actual.ErrorCode);
        }
        public async Task QueueMessageBatchAsync <T>(Guid streamGuid, string streamNamespace, IEnumerable <T> events, StreamSequenceToken token, Dictionary <string, object> requestContext)
        {
            var queueId = _streamQueueMapper.GetQueueForStream(streamGuid, streamNamespace);

            var partitionId = (int)queueId.GetNumericId();

            _logger.Info("KafkaQueueAdapter - For StreamId: {0}, StreamNamespace:{1} using partition {2}", streamGuid, streamNamespace, partitionId);

            var enumeratedEvents = events.ToList();
            var payload          = _batchFactory.ToKafkaMessage(streamGuid, streamNamespace, enumeratedEvents.AsEnumerable(), requestContext);

            if (payload == null)
            {
                _logger.Info("The batch factory returned a faulty message, the message was not sent");
                return;
            }

            var messageToSend = new List <Message> {
                payload
            };

            IEnumerable <ProduceResponse> response;

            using (TimerTimeToProduceMessage.NewContext())
            {
                response = await _producer.SendMessageAsync(_options.TopicName, messageToSend, (short)_options.AckLevel, partition : partitionId);
            }

            // This is ackLevel != 0 check
            if (response != null && !response.Contains(null))
            {
                var responsesWithError =
                    response.Where(messageResponse => messageResponse.Error != (int)ErrorResponseCode.NoError).ToList();

                if (responsesWithError.Any())
                {
                    List <Exception> allResponsesExceptions = new List <Exception>();

                    // Checking all the responses
                    foreach (var messageResponse in responsesWithError)
                    {
                        _logger.Warn((int)KafkaErrorCodes.KafkaStreamProviderBase,
                                     "KafkaQueueAdapter - Error sending message through kafka client, the error code is {0}, message offset is {1}",
                                     messageResponse.Error, messageResponse.Offset);

                        var newException = new KafkaApplicationException(
                            "Failed at producing the message with offset {0} for queue {1} in topic {2}",
                            messageResponse.Offset,
                            queueId, _options.TopicName)
                        {
                            ErrorCode = messageResponse.Error,
                            Source    = "KafkaStreamProvider"
                        };
                        allResponsesExceptions.Add(newException);
                    }

                    // Aggregating the exceptions, and putting them inside a KafkaStreamProviderException
                    AggregateException           exceptions       = new AggregateException(allResponsesExceptions);
                    KafkaStreamProviderException exceptionToThrow =
                        new KafkaStreamProviderException("Producing message failed for one or more requests", exceptions);
                    throw exceptionToThrow;
                }
            }

            HistogramProducedMessageBatchSize.Update(enumeratedEvents.Count(), queueId.ToString());
            MeterProducedMessagesPerSecond.Mark(queueId.ToString(), 1);
        }