136 lines
4.6 KiB
C#
136 lines
4.6 KiB
C#
|
|
using System.Text;
|
|||
|
|
using Confluent.Kafka;
|
|||
|
|
using Google.Protobuf;
|
|||
|
|
using Newtonsoft.Json;
|
|||
|
|
using Newtonsoft.Json.Linq;
|
|||
|
|
using Tutorial;
|
|||
|
|
|
|||
|
|
namespace duoge
|
|||
|
|
{
|
|||
|
|
internal class Program
|
|||
|
|
{
|
|||
|
|
static void Main(string[] args)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
string json = @"{ 'name': 'John Doe', 'id': 123, 'email': 'john@example.com' }";
|
|||
|
|
JObject jsonObject = JObject.Parse(json);
|
|||
|
|
Person person = new Person();
|
|||
|
|
person.Name = (string)jsonObject["name"];
|
|||
|
|
person.Id = (int)jsonObject["id"];
|
|||
|
|
person.Email = (string)jsonObject["email"];
|
|||
|
|
Console.WriteLine("Name: " + person.Name); // 输出转换后的ProtoBuf对象信息
|
|||
|
|
byte[] bbb1 = Encoding.UTF8.GetBytes(json);
|
|||
|
|
|
|||
|
|
byte[] bbb = person.ToByteArray();
|
|||
|
|
|
|||
|
|
Person PPP = Person.Parser.ParseFrom(bbb);
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 方法1:使用静态Parser(推荐)
|
|||
|
|
Person restoredPerson1 = Person.Parser.ParseFrom(bbb);
|
|||
|
|
|
|||
|
|
// 方法2:创建新的Parser实例
|
|||
|
|
var parser = new MessageParser<Person>(() => new Person());
|
|||
|
|
Person restoredPerson2 = parser.ParseFrom(bbb);
|
|||
|
|
|
|||
|
|
// 方法3:使用扩展方法
|
|||
|
|
Person restoredPerson3 = Person.Parser.ParseFrom(bbb.AsMemory<byte>().ToArray());
|
|||
|
|
Console.WriteLine("Hello, World!");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void MMM()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
string[] _topics = ["", ""];
|
|||
|
|
List<IConsumer<string, string>> _consumers = new List<IConsumer<string, string>>();
|
|||
|
|
// 为每个主题创建一个消费者
|
|||
|
|
foreach (var topic in _topics)
|
|||
|
|
{
|
|||
|
|
var consumerConfig = new ConsumerConfig
|
|||
|
|
{
|
|||
|
|
BootstrapServers = "localhost:9092",
|
|||
|
|
GroupId = $"consumer-group-{topic}",
|
|||
|
|
AutoOffsetReset = AutoOffsetReset.Earliest,
|
|||
|
|
EnableAutoCommit = false
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
var consumer = new ConsumerBuilder<string, string>(consumerConfig).Build();
|
|||
|
|
consumer.Subscribe(topic);
|
|||
|
|
_consumers.Add(consumer);
|
|||
|
|
|
|||
|
|
// 为每个消费者启动一个独立的任务
|
|||
|
|
Task.Run(() => ConsumeMessages(consumer, topic));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
static private async Task ConsumeMessages(IConsumer<string, string> consumer, string topic)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
var consumeResult = consumer.Consume();
|
|||
|
|
|
|||
|
|
if (consumeResult != null)
|
|||
|
|
{
|
|||
|
|
Console.WriteLine($"收到消息 - 主题: {topic}, 键: {consumeResult.Message.Key}, 值: {consumeResult.Message.Value}");
|
|||
|
|
|
|||
|
|
// 手动提交偏移量
|
|||
|
|
consumer.Commit(consumeResult);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (ConsumeException ex)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
catch (OperationCanceledException)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//private async Task ProcessMessage(string topic, string key, string value)
|
|||
|
|
//{
|
|||
|
|
// // 根据不同的主题执行不同的处理逻辑
|
|||
|
|
// switch (topic)
|
|||
|
|
// {
|
|||
|
|
// case "topic-1":
|
|||
|
|
// await ProcessTopic1Message(key, value);
|
|||
|
|
// break;
|
|||
|
|
// case "topic-2":
|
|||
|
|
// await ProcessTopic2Message(key, value);
|
|||
|
|
// break;
|
|||
|
|
// // ... 其他主题的处理逻辑
|
|||
|
|
// default:
|
|||
|
|
// _logger.LogInformation($"处理默认主题消息: {topic}, Key: {key}, Value: {value}");
|
|||
|
|
// break;
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//private async Task ProcessTopic1Message(string key, string value)
|
|||
|
|
//{
|
|||
|
|
// // 主题1的具体处理逻辑
|
|||
|
|
// await Task.Delay(100); // 模拟处理耗时
|
|||
|
|
// _logger.LogInformation($"处理主题1消息: Key={key}, Value={value}");
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//private async Task ProcessTopic2Message(string key, string value)
|
|||
|
|
//{
|
|||
|
|
// // 主题2的具体处理逻辑
|
|||
|
|
// await Task.Delay(100); // 模拟处理耗时
|
|||
|
|
// _logger.LogInformation($"处理主题2消息: Key={key}, Value={value}");
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//public Task StopAsync(CancellationToken cancellationToken)
|
|||
|
|
//{
|
|||
|
|
// _logger.LogInformation("停止Kafka消费者服务...");
|
|||
|
|
// _cancellationTokenSource.Cancel();
|
|||
|
|
|
|||
|
|
// foreach (var consumer in _consumers)
|
|||
|
|
// {
|
|||
|
|
// consumer.Close();
|
|||
|
|
// consumer.Dispose();
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// return Task.CompletedTask;
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|