是否可以使用 Kafka 将 Java 对象发送到 C# App
Is it Possible to send a Java Object to C# App using Kafka
是否可以将 Java 对象(比方说用户)发送到在 C# 中使用并序列化为用户对象的主题?
假设我有以下从 Java PoJo 构建的 avro 模式(字段是姓名和年龄)
{
"namespace": "io.confluent.developer",
"type": "record",
"name": "User",
"fields": [
{
"name": "name",
"type": [
"null",
"string"
],
"default": null
},
{
"name": "age",
"type": [
"null",
"int"
],
"default": null
}
]
}
生成 User.class
然后这样发送:
Service
@CommonsLog(topic = "Producer Logger")
@RequiredArgsConstructor
public class Producer {
@Value("${topic.name}")
private String TOPIC;
private final KafkaTemplate<String, User> kafkaTemplate;
void sendMessage(User user) {
this.kafkaTemplate.send(this.TOPIC, user.getName(), user);
log.info(String.format("Produced user -> %s", user));
}
}
我也有一个 Schema 注册表,但我不知道如何使用 C# 中的消息并将其反序列化给具有相同字段的用户 class:
public class Users
{
public int id = 0;
public string name = string.Empty;
public Users()
{
// Constructor Statements
}
public void GetUserDetails(int uid, string uname)
{
id = uid;
uname = name;
Console.WriteLine("Id: {0}, Name: {1}", id, name);
}
public int Designation { get; set; }
public string Location { get; set; }
}
感谢您的帮助。
是的,这是可能的。您可以使用 official .NET kafka client 来消费消息。
您要做的第一件事是根据您使用的相同架构生成 C# class。您可以通过以下方式做到这一点:
- 正在安装 avrogen 工具:
dotnet tool install --global Apache.Avro.Tools
- 生成class:
avrogen -s user_schema.avsc .
然后您将通过 class 实现获得 User.cs
。您需要做的就是配置 .NET Kafka 客户端并使用消息:
var schemaRegistryConfig = new SchemaRegistryConfig
{
Url = "schemaRegistryUrl"
};
var consumerConfig = new ConsumerConfig
{
BootstrapServers = "bootstrapServers",
GroupId = "group"
};
using var schemaRegistry = new CachedSchemaRegistryClient(schemaRegistryConfig);
using var consumer = new ConsumerBuilder<string, User>(consumerConfig)
.SetValueDeserializer(new AvroDeserializer<User>(schemaRegistry).AsSyncOverAsync())
.Build();
consumer.Subscribe(topicName);
var consumeResult = consumer.Consume(cts.Token);
您可以查看 this example 了解更多信息。
请注意,您不能使用您在问题中提供的 User
class,因为 class 结构有一些要求。因此,您应该使用通过 Avro 架构中的工具生成的那个。
是否可以将 Java 对象(比方说用户)发送到在 C# 中使用并序列化为用户对象的主题?
假设我有以下从 Java PoJo 构建的 avro 模式(字段是姓名和年龄)
{
"namespace": "io.confluent.developer",
"type": "record",
"name": "User",
"fields": [
{
"name": "name",
"type": [
"null",
"string"
],
"default": null
},
{
"name": "age",
"type": [
"null",
"int"
],
"default": null
}
]
}
生成 User.class
然后这样发送:
Service
@CommonsLog(topic = "Producer Logger")
@RequiredArgsConstructor
public class Producer {
@Value("${topic.name}")
private String TOPIC;
private final KafkaTemplate<String, User> kafkaTemplate;
void sendMessage(User user) {
this.kafkaTemplate.send(this.TOPIC, user.getName(), user);
log.info(String.format("Produced user -> %s", user));
}
}
我也有一个 Schema 注册表,但我不知道如何使用 C# 中的消息并将其反序列化给具有相同字段的用户 class:
public class Users
{
public int id = 0;
public string name = string.Empty;
public Users()
{
// Constructor Statements
}
public void GetUserDetails(int uid, string uname)
{
id = uid;
uname = name;
Console.WriteLine("Id: {0}, Name: {1}", id, name);
}
public int Designation { get; set; }
public string Location { get; set; }
}
感谢您的帮助。
是的,这是可能的。您可以使用 official .NET kafka client 来消费消息。
您要做的第一件事是根据您使用的相同架构生成 C# class。您可以通过以下方式做到这一点:
- 正在安装 avrogen 工具:
dotnet tool install --global Apache.Avro.Tools
- 生成class:
avrogen -s user_schema.avsc .
然后您将通过 class 实现获得 User.cs
。您需要做的就是配置 .NET Kafka 客户端并使用消息:
var schemaRegistryConfig = new SchemaRegistryConfig
{
Url = "schemaRegistryUrl"
};
var consumerConfig = new ConsumerConfig
{
BootstrapServers = "bootstrapServers",
GroupId = "group"
};
using var schemaRegistry = new CachedSchemaRegistryClient(schemaRegistryConfig);
using var consumer = new ConsumerBuilder<string, User>(consumerConfig)
.SetValueDeserializer(new AvroDeserializer<User>(schemaRegistry).AsSyncOverAsync())
.Build();
consumer.Subscribe(topicName);
var consumeResult = consumer.Consume(cts.Token);
您可以查看 this example 了解更多信息。
请注意,您不能使用您在问题中提供的 User
class,因为 class 结构有一些要求。因此,您应该使用通过 Avro 架构中的工具生成的那个。