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