使用Assign()时,Kafka.net客户端未收到任何消息
我试图让我的服务在开始初始化内部数据结构时从头到尾重新阅读卡夫卡主题。我正在使用Confluent.NET客户端。 据我所知,以下代码应向我订阅主题设置偏移量:使用Assign()时,Kafka.net客户端未收到任何消息,.net,apache-kafka,confluent-platform,.net,Apache Kafka,Confluent Platform,我试图让我的服务在开始初始化内部数据结构时从头到尾重新阅读卡夫卡主题。我正在使用Confluent.NET客户端。 据我所知,以下代码应向我订阅主题设置偏移量: consumer.Assign(new TopicPartitionOffset(topic, Partition.Any, Offset.Beginning)); 但由于某些原因,我没有收到主题中预先存在的消息,也没有收到新消息。 我对Assign()方法的理解是错误的吗?是否有一种方法可以使用Subscribe()实现所需的结果,
consumer.Assign(new TopicPartitionOffset(topic, Partition.Any, Offset.Beginning));
但由于某些原因,我没有收到主题中预先存在的消息,也没有收到新消息。
我对Assign()方法的理解是错误的吗?是否有一种方法可以使用Subscribe()实现所需的结果,而无需使用kafka CLI硬重置偏移
这是一个完整的测试客户端,我的输出总是“无消息…”,尽管topic有消息,并且新消息正在到达
static void Main(string[] args)
{
var config = new ConsumerConfig
{
BootstrapServers = "localhost:9092",
GroupId = "test-consumer",
AutoOffsetReset = AutoOffsetReset.Earliest,
};
var consumer = new ConsumerBuilder<Null, byte[]>(config).Build();
var topic = "test-topic";
consumer.Assign(new TopicPartitionOffset(topic, Partition.Any, Offset.Beginning));
while (true)
{
var result = consumer.Consume(TimeSpan.FromSeconds(5));
if (result == null)
Console.WriteLine("No messages...");
else
Console.WriteLine($"Offset: {result.Offset}");
}
}
static void Main(字符串[]args)
{
var config=new ConsumerConfig
{
bootstrapserver=“localhost:9092”,
GroupId=“测试消费者”,
AutoOffsetReset=AutoOffsetReset.Earlime,
};
var consumer=new ConsumerBuilder(config.Build();
var topic=“测试主题”;
Assign(新的TopicPartitionOffset(topic,Partition.Any,Offset.start));
while(true)
{
var结果=消费者消费(TimeSpan.FromSeconds(5));
如果(结果==null)
Console.WriteLine(“无消息…”);
其他的
WriteLine($“Offset:{result.Offset}”);
}
}
为什么要使用分配?以下内容适用于您:
public static void Main(string[] args)
{
var conf = new ConsumerConfig
{
GroupId = "test-consumer",
BootstrapServers = "localhost:9092",
AutoOffsetReset = AutoOffsetReset.Earliest
};
using (var c = new ConsumerBuilder<Ignore, string>(conf).Build())
{
c.Subscribe("test-topic");
CancellationTokenSource cts = new CancellationTokenSource();
Console.CancelKeyPress += (_, e) => {
e.Cancel = true; // prevent the process from terminating.
cts.Cancel();
};
try
{
while (true)
{
try
{
var cr = c.Consume(cts.Token);
Console.WriteLine($"Message '{cr.Value}' at: '{cr.TopicPartitionOffset}'.");
}
catch (ConsumeException e)
{
Console.WriteLine($"Error: {e.Error.Reason}");
}
}
}
catch (OperationCanceledException)
{
c.Close();
}
}
}
publicstaticvoidmain(字符串[]args)
{
var conf=new ConsumerConfig
{
GroupId=“测试消费者”,
bootstrapserver=“localhost:9092”,
AutoOffsetReset=AutoOffsetReset.Earlime
};
使用(var c=new ConsumerBuilder(conf.Build())
{
c、 订阅(“测试主题”);
CancellationTokenSource cts=新的CancellationTokenSource();
Console.CancelKeyPress+=(\uE)=>{
e、 Cancel=true;//防止进程终止。
cts.Cancel();
};
尝试
{
while(true)
{
尝试
{
var cr=消费成本(cts.Token);
WriteLine($“消息'{cr.Value}'位于:'{cr.TopicPartitionOffset}'。”;
}
捕获(消费异常)
{
WriteLine($“Error:{e.Error.Reason}”);
}
}
}
捕获(操作取消异常)
{
c、 Close();
}
}
}
为什么要使用分配?以下内容适用于您:
public static void Main(string[] args)
{
var conf = new ConsumerConfig
{
GroupId = "test-consumer",
BootstrapServers = "localhost:9092",
AutoOffsetReset = AutoOffsetReset.Earliest
};
using (var c = new ConsumerBuilder<Ignore, string>(conf).Build())
{
c.Subscribe("test-topic");
CancellationTokenSource cts = new CancellationTokenSource();
Console.CancelKeyPress += (_, e) => {
e.Cancel = true; // prevent the process from terminating.
cts.Cancel();
};
try
{
while (true)
{
try
{
var cr = c.Consume(cts.Token);
Console.WriteLine($"Message '{cr.Value}' at: '{cr.TopicPartitionOffset}'.");
}
catch (ConsumeException e)
{
Console.WriteLine($"Error: {e.Error.Reason}");
}
}
}
catch (OperationCanceledException)
{
c.Close();
}
}
}
publicstaticvoidmain(字符串[]args)
{
var conf=new ConsumerConfig
{
GroupId=“测试消费者”,
bootstrapserver=“localhost:9092”,
AutoOffsetReset=AutoOffsetReset.Earlime
};
使用(var c=new ConsumerBuilder(conf.Build())
{
c、 订阅(“测试主题”);
CancellationTokenSource cts=新的CancellationTokenSource();
Console.CancelKeyPress+=(\uE)=>{
e、 Cancel=true;//防止进程终止。
cts.Cancel();
};
尝试
{
while(true)
{
尝试
{
var cr=消费成本(cts.Token);
WriteLine($“消息'{cr.Value}'位于:'{cr.TopicPartitionOffset}'。”;
}
捕获(消费异常)
{
WriteLine($“Error:{e.Error.Reason}”);
}
}
}
捕获(操作取消异常)
{
c、 Close();
}
}
}
问题在于我调用了带有分区的Assign()。任何情况下,以下代码都有效:
consumer.Assign(新TopicPartitionOffset(主题,新分区(0),Offset.start))代码>问题在于我调用了带有分区的Assign()。任何情况下,以下代码都可以工作:
consumer.Assign(新TopicPartitionOffset(主题,新分区(0),Offset.start))
Plase removeTimeSpan.FromSeconds(5)
从consumer.consumer(5)
中删除时间跨度。然后再试一次……如果有效,请告诉我:)它在consumer.consumer()调用中永远冻结。Plase removeTimeSpan.FromSeconds(5)
来自使用者.consumer
…然后再试一次…让我知道这是否有效:)在consumer.consumer()调用时它将永远冻结。这将从上次提交的偏移量读取事件。我的目标是从头开始重新读取所有事件。@AlexeyUkolov这由AutoOffsetReset=AutoOffsetReset.Earlime
控制。如果将GroupId
更改为“test-consumer-2”
(即新的/以前未看到的消费者组),您将能够从一开始就阅读消息。希望这有帮助。@AlexeyUkolov让我知道这是否对您有效,以便我可以更新我的答案。只有在最后提交的偏移量不再可用时,AutoOffsetReset才会生效。更改组Id可能有效,但我需要始终创建新的组Id。Assign()方法不会在zookeeper中创建订阅组,这就是为什么我尝试使用它而不是Subscribe()。这将从上次提交的偏移量读取事件。我的目标是从头开始重新读取所有事件。@AlexeyUkolov这由AutoOffsetReset=AutoOffsetReset.Earlime
控制。如果将GroupId
更改为“test-consumer-2”
(即新的/以前未看到的消费者组),您将能够从一开始就阅读消息。希望这有帮助。@AlexeyUkolov让我知道这是否对您有效,以便我可以更新我的答案。只有在最后提交的偏移量不再可用时,AutoOffsetReset才会生效。更改组Id可能有效,但我需要始终创建新的组Id。Assign()方法不执行此操作