如何在按钮单击时使用最新消息并将其写入txt文件?

时间:2018-06-13 16:42:38

标签: c# .net apache-kafka kafka-consumer-api confluent-kafka

我写了一个简单的制作人,发送按钮点击消息给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?
        }
    }
}

1 个答案:

答案 0 :(得分:0)

注意:在我开始写答案之前只是一个免责声明:我不熟悉C#,所以我会尝试在概念上回答这个问题。

我认为您在消费者空间内需要做的就是:

  1. 通过调用消费者的subscribe()方法
  2. 订阅该主题
  3. 调用消费者的poll()方法 - &gt;这将返回新写入的记录
  4. 处理循环中的所有记录,即根据需要将每条消息(密钥和/或值)打包到新文件中。
  5. 我在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个文件。

    此外,无限循环的原因是确保消费者只是继续运行,因为如果消费者没有定期轮询,那么消费者组协调员会假定消费者已经死亡并且在消费者中触发了重新平衡。消费者群体。

    我希望这有帮助!