1,引用dll包,使用 Confluent.Kafka 插件,直接在nuget中安装即可;
2,生产者代码
/// <summary>
/// 生产者
/// </summary>
/// <param name="inputParams"></param>
public static void AsyncMain(JObject inputParams)
{
string url = Properties.Settings.Default.DeviceUrl;//获取配置的kafka地址
var conf = new ProducerConfig { BootstrapServers = url };
Action<DeliveryReport<Null, string>> handler = r =>
Console.WriteLine(!r.Error.IsError
? $"Delivered message to {r.Value}"
: $"Delivery Error: {r.Error.Reason}");
using (var p = new ProducerBuilder<Null, string>(conf).Build())
{
//获取约定好的topic
mytopic = Properties.Settings.Default.DeviceTopic;
string datastr = inputParams.ToString();
p.Produce(mytopic, new Message<Null, string> { Value = datastr }, handler);
p.Flush(TimeSpan.FromSeconds(10));
}
}
3,消费者代码
/// <summary>
/// 消费kafka
/// </summary>
public static string Run_Consume(JObject inputParams)
{
string returnmsg = "";
string topics = Properties.Settings.Default.JZHisTopic;
// CancellationToken cancellationToken = new CancellationToken();
string brokerList = Properties.Settings.Default.DeviceUrl;
var config = new ConsumerConfig
{
BootstrapServers = brokerList,
GroupId = "csharp-consumer",
EnableAutoCommit = false,
StatisticsIntervalMs = 5000,
SessionTimeoutMs = 6000,
AutoOffsetReset = AutoOffsetReset.Earliest,
EnablePartitionEof = true
};
const int commitPeriod = 5;
using (var consumer = new ConsumerBuilder<Ignore, string>(config)
.SetErrorHandler((_, e) => Console.WriteLine($"Error: {e.Reason}"))
.SetStatisticsHandler((_, json) => Console.WriteLine($"Statistics: {json}"))
.SetPartitionsAssignedHandler((c, partitions) =>
{
Console.WriteLine($"Assigned partitions: [{string.Join(", ", partitions)}]");
})
.SetPartitionsRevokedHandler((c, partitions) =>
{
Console.WriteLine($"Revoking assignment: [{string.Join(", ", partitions)}]");
})
.Build())
{
consumer.Subscribe(topics);
try
{
while (true)
{
try
{
var consumeResult = consumer.Consume();
if (consumeResult.IsPartitionEOF)
{
Console.WriteLine(
$"Reached end of topic {consumeResult.Topic}, partition {consumeResult.Partition}, offset {consumeResult.Offset}.");
continue;
}
Console.WriteLine($"Received message at {consumeResult.TopicPartitionOffset}: {consumeResult.Value}");
if (consumeResult.Offset % commitPeriod == 0)
{
try
{
consumer.Commit(consumeResult);
returnmsg = returnmsg + consumeResult.Value;
}
catch (KafkaException e)
{
Console.WriteLine($"Commit error: {e.Error.Reason}");
}
}
}
catch (ConsumeException e)
{
Console.WriteLine($"Consume error: {e.Error.Reason}");
}
}
}
catch (OperationCanceledException)
{
Console.WriteLine("Closing consumer.");
consumer.Close();
}
}
return returnmsg;
}