Przeglądaj źródła

add kafka extend project.

master
yangxiaodong 7 lat temu
rodzic
commit
fc967b6915
4 zmienionych plików z 164 dodań i 0 usunięć
  1. +15
    -0
      src/Cap.Consistency.Kafka/Cap.Consistency.Kafka.csproj
  2. +101
    -0
      src/Cap.Consistency.Kafka/KafkaConsumerClient.cs
  3. +14
    -0
      src/Cap.Consistency.Kafka/KafkaConsumerClientFactory.cs
  4. +34
    -0
      src/Cap.Consistency.Kafka/KafkaTopicAttribute.cs

+ 15
- 0
src/Cap.Consistency.Kafka/Cap.Consistency.Kafka.csproj Wyświetl plik

@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard1.6</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Confluent.Kafka" Version="0.9.5" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Cap.Consistency\Cap.Consistency.csproj" />
</ItemGroup>

</Project>

+ 101
- 0
src/Cap.Consistency.Kafka/KafkaConsumerClient.cs Wyświetl plik

@@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cap.Consistency.Consumer;
using Cap.Consistency.Infrastructure;
using Confluent.Kafka;
using Confluent.Kafka.Serialization;

namespace Cap.Consistency.Kafka
{
public class KafkaTopicPartition
{
public string Topic { get; set; }

public int Partition { get; set; }
}

public class KafkaConsumerClient : IConsumerClient, IDisposable
{

private readonly string _groupId;
private readonly string _bootstrapServers;

private Consumer<Null, string> _consumerClient;

public event EventHandler<DeliverMessage> MessageReceieved;

public IDeserializer<string> StringDeserializer { get; set; }

public KafkaConsumerClient(string groupId, string bootstrapServers) {
_groupId = groupId;
_bootstrapServers = bootstrapServers;

StringDeserializer = new StringDeserializer(Encoding.UTF8);
}

public void Subscribe(string topic) {
Subscribe(topic, 0);
}

public void Subscribe(string topicName, int partition) {

if (_consumerClient == null) {
InitKafkaClient();
}
_consumerClient.Assignment.Add(new TopicPartition(topicName, partition));
}

public void Subscribe(IEnumerable<KafkaTopicPartition> topicList) {

if (_consumerClient == null) {
InitKafkaClient();
}

if (topicList == null || topicList.Count() == 0) {
throw new ArgumentNullException(nameof(topicList));
}

foreach (var item in topicList) {
Subscribe(item.Topic, item.Partition);
}
}


public void Listening(TimeSpan timeout) {
while (true) {
_consumerClient.Poll(timeout);
}
}

public void Dispose() {
_consumerClient.Dispose();
}

#region private methods

private void InitKafkaClient() {
var config = new Dictionary<string, object>{
{ "group.id", _groupId },
{ "bootstrap.servers", _bootstrapServers }
};

_consumerClient = new Consumer<Null, string>(config, null, StringDeserializer);
_consumerClient.OnMessage += ConsumerClient_OnMessage;
}

private void ConsumerClient_OnMessage(object sender, Message<Null, string> e) {
var message = new DeliverMessage {
MessageKey = e.Topic,
Value = e.Value
};
MessageReceieved?.Invoke(sender, message);
}
#endregion

//public void

}
}

+ 14
- 0
src/Cap.Consistency.Kafka/KafkaConsumerClientFactory.cs Wyświetl plik

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Text;
using Cap.Consistency.Consumer;

namespace Cap.Consistency.Kafka
{
public class KafkaConsumerClientFactory : IConsumerClientFactory
{
public IConsumerClient Create(string groupId, string clientHostAddress) {
return new KafkaConsumerClient(groupId, clientHostAddress);
}
}
}

+ 34
- 0
src/Cap.Consistency.Kafka/KafkaTopicAttribute.cs Wyświetl plik

@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Text;
using Cap.Consistency.Abstractions;

namespace Cap.Consistency.Kafka
{
public class KafkaTopicAttribute : TopicAttribute
{
public KafkaTopicAttribute(string topicName)
: this(topicName, 0) { }

public KafkaTopicAttribute(string topicName, int partition)
: this(topicName, partition, 0) { }

public KafkaTopicAttribute(string topicName, int partition, long offset)
: base(topicName) {
Offset = offset;
Partition = partition;
}

public int Partition { get; }

public long Offset { get; }

public bool IsPartition { get { return Partition == 0; } }

public bool IsOffset { get { return Offset == 0; } }

public override string ToString() {
return Name;
}
}
}

Ładowanie…
Anuluj
Zapisz