public RequestResponseSerializationTest()
 {
     this.producerRequest       = SerializationTestUtils.CreateTestProducerRequest();
     this.producerResponse      = SerializationTestUtils.CreateTestProducerResponse();
     this.fetchRequest          = SerializationTestUtils.CreateTestFetchRequest();
     this.offsetRequest         = SerializationTestUtils.CreateTestOffsetRequest();
     this.offsetResponse        = SerializationTestUtils.CreateTestOffsetResponse();
     this.topicMetadataRequest  = SerializationTestUtils.CreateTestTopicMetadataRequest();
     this.topicMetadataResponse = SerializationTestUtils.CreateTestTopicMetadataResponse();
 }
Пример #2
0
        public static OffsetResponse setOffsetResponse(FSPOffset offset)
        {
            OffsetResponse resp = new OffsetResponse();

            resp.Address   = offset.Address;
            resp.DataGroup = offset.Datagroup;
            resp.DataType  = offset.DataType;
            resp.Value     = offset.Value;
            //resp.Version = Library.Properties.Version.getVersion();
            return(resp);
        }
    public void TestSerializationAndDeserialization()
    {
        var buffer = ByteBuffer.Allocate(this.producerRequest.SizeInBytes);

        this.producerRequest.WriteTo(buffer);
        buffer.Rewind();
        var deserializedProducerRequest = ProducerRequest.ReadFrom(buffer);

        Assert.Equal(this.producerRequest, deserializedProducerRequest);

        buffer = ByteBuffer.Allocate(this.producerResponse.SizeInBytes);
        this.producerResponse.WriteTo(buffer);
        buffer.Rewind();
        var deserializedProducerResponse = ProducerResponse.ReadFrom(buffer);

        Assert.Equal(this.producerResponse, deserializedProducerResponse);

        buffer = ByteBuffer.Allocate(this.fetchRequest.SizeInBytes);
        this.fetchRequest.WriteTo(buffer);
        buffer.Rewind();
        var deserializedFetchRequest = FetchRequest.ReadFrom(buffer);

        Assert.Equal(this.fetchRequest, deserializedFetchRequest);

        buffer = ByteBuffer.Allocate(this.offsetRequest.SizeInBytes);
        this.offsetRequest.WriteTo(buffer);
        buffer.Rewind();
        var deserializedOffsetRequest = OffsetRequest.ReadFrom(buffer);

        Assert.Equal(this.offsetRequest, deserializedOffsetRequest);

        buffer = ByteBuffer.Allocate(this.offsetResponse.SizeInBytes);
        this.offsetResponse.WriteTo(buffer);
        buffer.Rewind();
        var deserializedOffsetResponse = OffsetResponse.ReadFrom(buffer);

        Assert.Equal(this.offsetResponse, deserializedOffsetResponse);

        buffer = ByteBuffer.Allocate(this.topicMetadataRequest.SizeInBytes);
        this.topicMetadataRequest.WriteTo(buffer);
        buffer.Rewind();
        var deserializedTopicMetadataRequest = TopicMetadataRequest.ReadFrom(buffer);

        Assert.Equal(this.topicMetadataRequest, deserializedTopicMetadataRequest);

        buffer = ByteBuffer.Allocate(this.topicMetadataResponse.SizeInBytes);
        this.topicMetadataResponse.WriteTo(buffer);
        buffer.Rewind();
        var deserializedTopicMetadataResponse = TopicMetadataResponse.ReadFrom(buffer);

        Assert.Equal(this.topicMetadataResponse, deserializedTopicMetadataResponse);
    }
Пример #4
0
        static void Main(string[] args)
        {
            string    topicName     = "kafkatopic";
            const int partitionId   = 0;
            const int correlationId = 0;
            const int max           = 4;

            if (args.Length < 1)
            {
                Usage();
                return;
            }

            string serverAddress = args[0].Split(':')[0];
            int    serverPort    = Convert.ToInt32(args[0].Split(':')[1]);

            if (args.Length > 1)
            {
                topicName = args[1];
            }


            var connector = new Connector(serverAddress, serverPort);


            // Can't get the time to work. Always use -1 i.e. from start
            const long     time           = -1;
            const string   clientId       = "c# KafkaOffset util";
            OffsetResponse offsetResponse = connector.GetOffsetResponse(topicName, time, max, correlationId, clientId, partitionId);

            foreach (var offsetTopicName in offsetResponse.Topics())
            {
                Console.WriteLine("Topic:\t\t" + offsetTopicName);
                foreach (var partition in offsetResponse.Partitions(offsetTopicName))
                {
                    Console.WriteLine("PartitionId:\t" + partition);
                    Console.WriteLine("Error:\t\t" + offsetResponse.Errorcode(offsetTopicName, partition));
                    Console.WriteLine("Offset count:\t" + offsetResponse.Offsets(offsetTopicName, partition).Count);
                    Console.Write("Offsets:\t");
                    for (int index = 0; index < offsetResponse.Offsets(offsetTopicName, partition).Count; index++)
                    {
                        if (index > 0)
                        {
                            Console.Write(',');
                        }
                        var offset = offsetResponse.Offsets(offsetTopicName, partition)[index];
                        Console.Write(offset);
                    }
                }
            }
        }
Пример #5
0
        /// <summary>
        /// Get a list of valid offsets (up to maxSize) before the given time.
        /// </summary>
        /// <param name="request">The offset request.</param>
        /// <returns>List of offsets, in descending order.</returns>
        public OffsetResponse GetOffsetResponseBefore(OffsetRequest request)
        {
            using (var connection = new KafkaConnection(server, port))
            {
                connection.Write(request.GetRequestBytes().ToArray());

                int dataLength = BitConverter.ToInt32(BitWorks.ReverseBytes(connection.Read(4)), 0);

                if (dataLength == 0)
                {
                    return(null);
                }
                byte[] data           = connection.Read(dataLength);
                var    offsetResponse = new OffsetResponse(data);
                return(offsetResponse);
            }
        }
Пример #6
0
        private KafkaTopic TopicFromResponse(OffsetResponse offsetResponse)
        {
            string topicName   = offsetResponse.Topics()[0];
            int    partitionId = offsetResponse.Partitions(topicName)[0];
            short  errorCode   = offsetResponse.Errorcode(topicName, partitionId);

            if (errorCode != 0)
            {
                if (errorCode == 3)
                {
                    throw new NoTopicException(topicName);
                }
                throw new KafkaException(errorCode);
            }
            long offset     = offsetResponse.Offsets(topicName, partitionId)[0];
            var  kafkaTopic = new KafkaTopic(topicName, partitionId, offset);

            return(kafkaTopic);
        }
        public HttpResponseMessage OpenPost([FromBody] FSUIPCConnect value)
        {
            Logger log = LogManager.GetCurrentClassLogger();

            try
            {
                log.Info("Received OpenFSUIPC Connection call");
                ConnectResponse resp = new ConnectResponse();

                if (FSPFSUIPCConnection.IsOpen)
                {
                    log.Info("Connection already is open");
                    resp.Message = "Connection Opened";
                }
                else
                {
                    log.Info("Opening connection..");

                    FSPFSUIPCConnection.Open();
                    resp.Message = "Connection Opened";
                }

                FSPFSUIPCConnection.AddOffset(15616, Datatype.String, "Connect");
                FSPOffset      _offset = FSPFSUIPCConnection.Process("Connect").First();
                OffsetResponse _resp   = OffsetHelpers.setOffsetResponse(_offset);

                resp.Version = FSPServerV2.Library.Properties.Version.getVersion();

                resp.Simulator = FSPFSUIPCConnection.FlightSimVersionConnected.ToString();
                resp.Aircraft  = _resp.Value;

                return(Request.CreateResponse(HttpStatusCode.OK, resp));
            }
            catch (Exception ee)
            {
                Console.WriteLine(ee.Message);
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Connection Error", ee));
                //return Request.CreateResponse(HttpStatusCode.OK, "error: " + ee.Message);
            }
        }
Пример #8
0
 public HttpResponseMessage ReadOffset(int offset, string datatype, string datagroup)
 {
     if (FSPFSUIPCConnection.IsOpen)
     {
         try
         {
             List <FSPOffset> offsets = FSPFSUIPCConnection.Process(datagroup);
             FSPOffset        _offset = (from o in offsets
                                         where o.Address == offset
                                         select o).First();
             OffsetResponse resp = OffsetHelpers.setOffsetResponse(_offset);
             return(Request.CreateResponse(HttpStatusCode.OK, resp));
         }
         catch (Exception ex)
         {
             return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Exception Getting Offset", ex));
         }
     }
     else
     {
         return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "FSUIPC Connection is closed!"));
     }
 }
Пример #9
0
        static void Main(string[] args)
        {
            string topicName     = "kafkatopic";
            int    partitionId   = 0;
            int    correlationId = 0;


            KafkaBusConnector busConnector = new KafkaBusConnector("192.168.0.105", 9092, "KafkaConsole");

            IKafkaMessageConsumer consumer = new MessageConsumer();

            consumer.Start(busConnector, topicName, partitionId, 4, DumpMessage);

            while (Console.KeyAvailable == false)
            {
                Thread.Sleep(100);
            }
            consumer.Stop();

            //short errorCode = busConnector.Produce(topicName, -1, "Hello");

            var stream = busConnector.CreateMessageStream(topicName, partitionId, KafkaMessageStream.StreamStart.Beginning);

            foreach (var kafkaMessage in stream)
            {
                Console.WriteLine(kafkaMessage);
                if (Console.KeyAvailable == true)
                {
                    ConsoleKeyInfo info = Console.ReadKey();
                    stream.Close();
                }
            }
            stream = busConnector.CreateMessageStream(topicName, partitionId, KafkaMessageStream.StreamStart.Next);
            foreach (var kafkaMessage in stream)
            {
                Console.WriteLine(kafkaMessage);
                if (Console.KeyAvailable == true)
                {
                    ConsoleKeyInfo info = Console.ReadKey();
                    stream.Close();
                }
            }



            Connector connector = new Connector("192.168.0.105", 9092);
            int       max       = 4;


            byte[] message = new byte[] { 49 };
            message = Encoding.ASCII.GetBytes("Hello from c#");
            //MetadataResponse metadataResponse = connector.Metadata(correlationId, "C#", topicName);

            //Console.WriteLine(metadataResponse);

            //foreach (var broker in metadataResponse.Brokers)
            //{
            //    Console.WriteLine("Brooker:" + broker);
            //}

            //foreach (string metadataTopicName in metadataResponse.Topics())
            //{
            //    Console.Write("Topic:" + metadataTopicName);

            //    if (metadataResponse.TopicErrorCode(metadataTopicName) != 0)
            //        Console.WriteLine("\tTopic error:" + metadataResponse.TopicErrorCode(metadataTopicName));
            //    else
            //        Console.WriteLine();

            //    foreach (var partitionMetadata in metadataResponse.Partitions(topicName))
            //    {
            //        Console.WriteLine("\t" + partitionMetadata);

            //    }
            //}

            //connector.Produce(correlationId, "c#", 500, topicName, partitionId, message);


            OffsetResponse offsetResponse = connector.GetOffsetResponse(topicName, OffsetRequest.LatestTime, max, correlationId, "C#", partitionId);

            FetchResponse fetchResponse;
            int           maxOffset = 0;

            foreach (var offsetTopicName in offsetResponse.Topics())
            {
                Console.WriteLine(offsetTopicName);
                foreach (var partition in offsetResponse.Partitions(offsetTopicName))
                {
                    Console.WriteLine("PartitionId:" + partition);
                    Console.WriteLine("Error:" + offsetResponse.Errorcode(offsetTopicName, partition));
                    Console.WriteLine("Offset count:" + offsetResponse.Offsets(offsetTopicName, partition).Count);
                    Console.WriteLine("Start offset:" + offsetResponse.Offsets(offsetTopicName, partition)[1]);
                    Console.WriteLine("End offset:" + offsetResponse.Offsets(offsetTopicName, partition)[0]);
                    fetchResponse = connector.Fetch(offsetTopicName, partition, correlationId, "C#", offsetResponse.Offsets(offsetTopicName, partition)[1], 5000);

                    foreach (var fetchTopic in fetchResponse.Topics)
                    {
                        foreach (FetchPartition fetchPartition in fetchTopic.Partitions)
                        {
                            Console.WriteLine("Error:" + fetchPartition.ErrorCode);
                            Console.WriteLine("Id:" + fetchPartition.PartitionId);
                            foreach (var messageSet in fetchPartition.MessageSets)
                            {
                                if (messageSet != null)
                                {
                                    Console.Write("Offset:" + messageSet.MessageOffset + "\t");
                                    Console.WriteLine("Message:" + messageSet.Message);
                                }
                            }
                            Console.WriteLine();
                        }
                    }
                }
            }

            //fetchResponse = connector.Fetch("kafkatopic", 0, 1, "C#", 7);
            //foreach (var fetchTopic in fetchResponse.Topics)
            //{
            //    foreach (FetchPartition fetchPartition in fetchTopic.Partitions)
            //    {
            //        Console.WriteLine("Error:" + fetchPartition.ErrorCode);
            //        Console.WriteLine("Id:" + fetchPartition.PartitionId);
            //        if (fetchPartition.MessageSet != null)
            //        {
            //            Console.WriteLine(fetchPartition.MessageSet.Message);
            //        }
            //        Console.WriteLine();
            //    }
            //}


            //FetchResponse fetchResponse = connector.Fetch("kafkatopic", partitionId, correlationId, "C#", offsetResponse.Topics[0].Partitions[0].Offsets[1]);

            //foreach (var topic in fetchResponse.Topics)
            //{
            //    Console.WriteLine(topic.TopicName);
            //    foreach (FetchPartition partition in topic.Partitions)
            //    {
            //        Console.WriteLine("Error:" + partition.ErrorCode);
            //        Console.WriteLine("Id:" + partition.PartitionId);
            //        Console.Write("Offset:" + partition.MessageSet.MessageOffset + " ");
            //        Console.WriteLine(partition.MessageSet.Message);
            //    }
            //}



            //FetchResponse fetchResponse = connector.Fetch("kafkatopic", 0, 1, 1, offsetResponse.Topics[0].Partitions[0].Offsets[0]);
            //long[] offsets = consumer.GetOffsetsBefore("kafkatopic", 0, OffsetRequest.LatestTime, max).ToArray();
            //List<Message> messages = consumer.Consume("kafkatopic", 0, offsets[0]);
            //foreach (var message in messages)
            //{
            //    Console.WriteLine(message.ToString());
            //}
        }
        /// <summary>
        ///  Get offset
        /// </summary>
        public void RefreshAndGetOffset(short versionId, string clientId, int correlationId, string topic, int partitionId, bool forceRefreshOffsetCache, out long earliestOffset, out long latestOffset)
        {
            earliestOffset = -1;
            latestOffset   = -1;
            if (!forceRefreshOffsetCache && this.TopicOffsetEarliest.ContainsKey(topic) && this.TopicOffsetEarliest[topic].ContainsKey(partitionId))
            {
                earliestOffset = this.TopicOffsetEarliest[topic][partitionId];
            }
            if (!forceRefreshOffsetCache && this.TopicOffsetLatest.ContainsKey(topic) && this.TopicOffsetLatest[topic].ContainsKey(partitionId))
            {
                latestOffset = this.TopicOffsetLatest[topic][partitionId];
            }
            if (!forceRefreshOffsetCache && earliestOffset != -1 && latestOffset != -1)
            {
                return;
            }
            //Get
            using (Consumer consumer = this.GetConsumer(topic, partitionId))
            {
                Dictionary <string, List <PartitionOffsetRequestInfo> > offsetRequestInfoEarliest = new Dictionary <string, List <PartitionOffsetRequestInfo> >();
                List <PartitionOffsetRequestInfo> offsetRequestInfoForPartitionsEarliest          = new List <PartitionOffsetRequestInfo>();
                offsetRequestInfoForPartitionsEarliest.Add(new PartitionOffsetRequestInfo(partitionId, OffsetRequest.EarliestTime, 1));
                offsetRequestInfoEarliest.Add(topic, offsetRequestInfoForPartitionsEarliest);
                OffsetRequest offsetRequestEarliest = new OffsetRequest(offsetRequestInfoEarliest);
                //Earliest
                OffsetResponse offsetResponseEarliest = consumer.GetOffsetsBefore(offsetRequestEarliest);
                List <PartitionOffsetsResponse> partitionOffsetEaliest = null;
                if (offsetResponseEarliest.ResponseMap.TryGetValue(topic, out partitionOffsetEaliest))
                {
                    foreach (var p in partitionOffsetEaliest)
                    {
                        if (p.Error == ErrorMapping.NoError && p.PartitionId == partitionId)
                        {
                            earliestOffset = p.Offsets[0];
                            //Cache
                            if (!this.TopicOffsetEarliest.ContainsKey(topic))
                            {
                                this.TopicOffsetEarliest.TryAdd(topic, new ConcurrentDictionary <int, long>());
                            }
                            this.TopicOffsetEarliest[topic][partitionId] = earliestOffset;
                        }
                    }
                }

                //Latest
                Dictionary <string, List <PartitionOffsetRequestInfo> > offsetRequestInfoLatest = new Dictionary <string, List <PartitionOffsetRequestInfo> >();
                List <PartitionOffsetRequestInfo> offsetRequestInfoForPartitionsLatest          = new List <PartitionOffsetRequestInfo>();
                offsetRequestInfoForPartitionsLatest.Add(new PartitionOffsetRequestInfo(partitionId, OffsetRequest.LatestTime, 1));
                offsetRequestInfoLatest.Add(topic, offsetRequestInfoForPartitionsLatest);
                OffsetRequest offsetRequestLatest = new OffsetRequest(offsetRequestInfoLatest);

                OffsetResponse offsetResponseLatest = consumer.GetOffsetsBefore(offsetRequestLatest);
                List <PartitionOffsetsResponse> partitionOffsetLatest = null;
                if (offsetResponseLatest.ResponseMap.TryGetValue(topic, out partitionOffsetLatest))
                {
                    foreach (var p in partitionOffsetLatest)
                    {
                        if (p.Error == ErrorMapping.NoError && p.PartitionId == partitionId)
                        {
                            latestOffset = p.Offsets[0];
                            //Cache
                            if (!this.TopicOffsetLatest.ContainsKey(topic))
                            {
                                this.TopicOffsetLatest.TryAdd(topic, new ConcurrentDictionary <int, long>());
                            }
                            this.TopicOffsetLatest[topic][partitionId] = latestOffset;
                        }
                    }
                }
            }
        }
Пример #11
0
        private static bool TryEncodeResponse(IKafkaWriter writer, IRequestContext context, OffsetResponse response)
        {
            if (response == null)
            {
                return(false);
            }

            var groupedTopics = response.Topics.GroupBy(t => t.TopicName).ToList();

            writer.Write(groupedTopics.Count);
            foreach (var topic in groupedTopics)
            {
                var partitions = topic.ToList();

                writer.Write(topic.Key)
                .Write(partitions.Count);
                foreach (var partition in partitions)
                {
                    writer.Write(partition.PartitionId)
                    .Write(partition.ErrorCode);
                    if (context.ApiVersion == 0)
                    {
                        writer.Write(1)
                        .Write(partition.Offset);
                    }
                    else
                    {
                        writer.Write(partition.Timestamp.ToUnixEpochMilliseconds() ?? 0L)
                        .Write(partition.Offset);
                    }
                }
            }
            return(true);
        }