在C#Unity中没有线程的Kafka使用者

时间:2019-05-09 06:03:55

标签: c# unity3d apache-kafka kafka-consumer-api

我正在尝试在Unity3d环境中编写一个Kafka使用者。由于统一不是线程安全的,因此我尝试编写一个更少线程的kafka Consumer Builder示例。最初,我从这个confluent example得到了编码思想。这是我的修改版本,但有一个问题,我应该在参数consumer.Consume(??)中提供什么。它接受CancellationTokenSourceTimeSpan。现在是什么样的时间,我不能为其分配简单的浮动时间吗?

void Start()
    {
        StartCoroutine(Main());
    }

    IEnumerator Main()
    {
        string bootstrapServers = "localhost:9092";
        string schemaRegistryUrl = "PC123:8081";
        string topicName = "sample-player";
        string groupName = "avro-generic-example-group";

        //CancellationTokenSource cts = new CancellationTokenSource();
        //var consumeTask = Task.Run(() =>
        //{
        using (var schemaRegistry = new CachedSchemaRegistryClient(new SchemaRegistryConfig { SchemaRegistryUrl = schemaRegistryUrl }))
        using (
            var consumer = new ConsumerBuilder<string, GenericRecord>(new ConsumerConfig { BootstrapServers = bootstrapServers, GroupId = groupName })
                .SetKeyDeserializer(new AsyncAvroDeserializer<string>(schemaRegistry).AsSyncOverAsync())
                .SetValueDeserializer(new AsyncAvroDeserializer<GenericRecord>(schemaRegistry).AsSyncOverAsync())
                .SetErrorHandler((_, e) => Debug.Log($"Error: {e.Reason}"))
                .Build())
        {
            Debug.Log("subscribe");
            consumer.Subscribe(topicName);

            //try
            //{
            while (true)
            {
                //try
                //{
                //CancellationTokenSource cts = new CancellationTokenSource();
                //cts.Token
                var consumeResult = consumer.Consume(TimeSpan.MaxValue);
                Debug.Log($"Key: {consumeResult.Message.Key}\nValue: {consumeResult.Value}");
                Debug.Log(consumeResult.Value.Schema);
                Debug.Log(consumeResult.Value.Schema["favorite_number"].GetProperty("favorite_number"));
                Debug.Log(consumeResult.Value.Schema["favorite_number"]);

                Avro.Field f;

                //consumeResult.Value

                consumeResult.Value.Schema.TryGetField("favorite_number", out f);

                Debug.Log(consumeResult.Value["favorite_number"]);
                yield return new WaitForEndOfFrame();

                //}
                //catch (ConsumeException e)
                //{
                //    Debug.Log($"Consume error: {e.Error.Reason}");
                //}

            }
            //}
            //catch (OperationCanceledException)
            //{
            //    // commit final offsets and leave the group.
            //    consumer.Close();
            //}
        }
        //});
        Debug.Log("Main end game.");
    }

0 个答案:

没有答案