我写了一个简单的制作人,发送按钮点击消息给Kafka。
class Producer : IProducer
{
public void produce(string msg, string topic)
{
var config = new Dictionary<string, object>
{
{"bootstrap.servers", "localhost:9092" }
};
using (var producer = new Producer<Null, string>(config, null, new StringSerializer(Encoding.UTF8)))
{
var m = producer.ProduceAsync(topic, null, msg).Result;
}
}
}
我的问题是 - 如何编写一个消费者,它会在按钮上单击并从Kafka接收最新发布的消息并将其保存到本地磁盘上某处的txt文件中?这就是我现在写的:
public class Consumer
{
public void Consume(string topic)
{
var config = new Dictionary<string, object>
{
{"group.id", "consumer-latest-msg" },
{"bootstrap.servers", "localhost:9092" },
{"auto.commit.interval.ms", 5000 },
{"auto.offset.reset", "latest" }
};
using (var consumer = new Consumer<Null, string>(config, null, new StringDeserializer(Encoding.UTF8)))
{
//what to do?
}
}
}
答案 0 :(得分:0)
注意:在我开始写答案之前只是一个免责声明:我不熟悉C#,所以我会尝试在概念上回答这个问题。
我认为您在消费者空间内需要做的就是:
subscribe()
方法poll()
方法 - &gt;这将返回新写入的记录我在Java中快速尝试了这个,这里是代码片段(包含上面提到的3个步骤)供您参考:
consumer.subscribe(Collections.singleton("test-topic"));
try {
while (true) {
ConsumerRecords<String, String> records = consumer.poll(1000);
for(ConsumerRecord<String, String> record : records) {
fWriter = new FileWriter("data/msg-" + i++);
pWriter = new PrintWriter(fWriter);
pWriter.print(record.value());
pWriter.close();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
consumer.close();
}
在运行此使用者客户端并从控制台生成者生成一些消息时,在指定的目录(数据)中创建了2个文件。
此外,无限循环的原因是确保消费者只是继续运行,因为如果消费者没有定期轮询,那么消费者组协调员会假定消费者已经死亡并且在消费者中触发了重新平衡。消费者群体。
我希望这有帮助!