예제 #1
0
        public static int Write(this IKafkaWriter writer, IEnumerable <Message> messages, MessageCodec codec)
        {
            if (codec == MessageCodec.None)
            {
                using (writer.MarkForLength()) {
                    writer.Write(messages);
                }
                return(0);
            }
            using (var messageWriter = new KafkaWriter()) {
                messageWriter.Write(messages);
                var messageSet = messageWriter.ToSegment(false);

                using (writer.MarkForLength()) {             // messageset
                    writer.Write(0L);                        // offset
                    using (writer.MarkForLength()) {         // message
                        using (writer.MarkForCrc()) {
                            writer.Write((byte)0)            // message version
                            .Write((byte)codec)              // attribute
                            .Write(-1);                      // key  -- null, so -1 length
                            using (writer.MarkForLength()) { // value
                                var initialPosition = writer.Position;
                                writer.WriteCompressed(messageSet, codec);
                                var compressedMessageLength = writer.Position - initialPosition;
                                return(messageSet.Count - compressedMessageLength);
                            }
                        }
                    }
                }
            }
        }