Как сохранить сообщения кафки в файл используя asp.net - PullRequest
0 голосов
/ 27 апреля 2018

Привет! Я создал консольное приложение для потребителя кафки для приема сообщений.

class Program
{
    static void Main(string[] args)
    {
        string topic = "IDGTestTopic";
        Uri uri = new Uri("http://localhost:9092");
        var options = new KafkaOptions(uri);
        var router = new BrokerRouter(options);
        var consumer = new Consumer(new ConsumerOptions(topic, router));
        foreach (var message in consumer.Consume())
        {
            Console.WriteLine(Encoding.UTF8.GetString(message.Value));
            //Saving messages in files
            string lines = Encoding.UTF8.GetString(message.Value);
            System.IO.File.WriteAllText(@"C:\Project\Kafka Research\Kafka_Consumer\Kafka_Consumer\KafkaMessages\Messages.txt", lines);
        }

    }
}

Но в нем хранятся только текущие сообщения. если вы видите консоль, все сообщения отображаются. enter image description here

Но если вы видите текстовый файл, он содержит только текущие сообщения enter image description here

Как сохранить все сообщения в файл?

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Для каждого сообщения System.IO.File.WriteAllText перезаписывает файл, и поэтому созданный файл будет содержать только последнее сообщение.

Чтобы сохранить все сообщения в одном файле, вы можете заменить System.IO.File.WriteAllText на System.IO.File.AppendAllText, как показано ниже:

foreach (var message in consumer.Consume()) {
    Console.WriteLine(Encoding.UTF8.GetString(message.Value));
    //Saving messages in files
    string lines = Encoding.UTF8.GetString(message.Value);
    System.IO.File.AppendAllText(@"C:\Project\Kafka Research\Kafka_Consumer\Kafka_Consumer\KafkaMessages\Messages.txt", lines);
}

Согласно документам,

Метод File.AppendAllText (String, String)

Открывает файл, добавляет к нему указанную строку, а затем закрывает файл Если файл не существует, этот метод создает file, записывает указанную строку в файл, затем закрывает файл.

и Метод File.WriteAllText (String, String)

Создает новый файл, записывает указанную строку в файл, а затем закрывает файл Если целевой файл уже существует, он перезаписывается.

0 голосов
/ 27 апреля 2018

@ Giorgos Myrianthous Ваш предыдущий второй выбор был лучше в некоторых отношениях. Присоединение к строителю строк и запись только один раз за пределы цикла в файл, скорее всего, будет намного быстрее, чем многократное выполнение ввода-вывода в каждом цикле. Вот что я предлагал:

StringBuilder linebuilder = new StringBuilder();  //this line outside the loop

foreach (var message in consumer.Consume()) {
    Console.WriteLine(Encoding.UTF8.GetString(message.Value));
    //Saving messages in files
    linebuilder.Append(Encoding.UTF8.GetString(message.Value)); //this line inside the loop
}

System.IO.File.AppendAllText(@"C:\Project\Kafka Research\Kafka_Consumer\Kafka_Consumer\KafkaMessages\Messages.txt", linebuilder.ToString(());
0 голосов
/ 27 апреля 2018

Каждый раз, когда вы принимаете сообщение, вы перезаписываете весь файл:

System.IO.File.WriteAllText

Вы должны сделать это вне цикла потребления.

...