1- using System ;
1+ using System ;
22using System . Text ;
33using System . Threading ;
44using System . Threading . Tasks ;
@@ -9,6 +9,7 @@ namespace Take.Elephant.Kafka
99 public class KafkaEventStreamPublisher < TKey , TEvent > : IEventStreamPublisher < TKey , TEvent > , IDisposable
1010 {
1111 private readonly IProducer < TKey , TEvent > _producer ;
12+ private readonly IKafkaHeaderProvider _headerProvider ;
1213
1314 public KafkaEventStreamPublisher ( string bootstrapServers , string topic , ISerializer < TEvent > serializer )
1415 : this ( new ProducerConfig ( ) { BootstrapServers = bootstrapServers } , topic , serializer )
@@ -21,14 +22,29 @@ public KafkaEventStreamPublisher(string bootstrapServers, string topic, Confluen
2122 }
2223
2324 public KafkaEventStreamPublisher (
24- ProducerConfig producerConfig ,
25+ ProducerConfig producerConfig ,
2526 string topic ,
2627 ISerializer < TEvent > serializer )
2728 : this (
2829 new ProducerBuilder < TKey , TEvent > ( producerConfig )
2930 . SetValueSerializer ( new EventSerializer ( serializer ) )
3031 . Build ( ) ,
31- topic )
32+ topic ,
33+ null )
34+ {
35+ }
36+
37+ public KafkaEventStreamPublisher (
38+ ProducerConfig producerConfig ,
39+ string topic ,
40+ ISerializer < TEvent > serializer ,
41+ IKafkaHeaderProvider headerProvider )
42+ : this (
43+ new ProducerBuilder < TKey , TEvent > ( producerConfig )
44+ . SetValueSerializer ( new EventSerializer ( serializer ) )
45+ . Build ( ) ,
46+ topic ,
47+ headerProvider )
3248 {
3349 }
3450
@@ -40,7 +56,22 @@ public KafkaEventStreamPublisher(
4056 new ProducerBuilder < TKey , TEvent > ( producerConfig )
4157 . SetValueSerializer ( kafkaSerializer )
4258 . Build ( ) ,
43- topic )
59+ topic ,
60+ null )
61+ {
62+ }
63+
64+ public KafkaEventStreamPublisher (
65+ ProducerConfig producerConfig ,
66+ string topic ,
67+ Confluent . Kafka . ISerializer < TEvent > kafkaSerializer ,
68+ IKafkaHeaderProvider headerProvider )
69+ : this (
70+ new ProducerBuilder < TKey , TEvent > ( producerConfig )
71+ . SetValueSerializer ( kafkaSerializer )
72+ . Build ( ) ,
73+ topic ,
74+ headerProvider )
4475 {
4576 }
4677
@@ -53,22 +84,64 @@ public KafkaEventStreamPublisher(
5384 throw new ArgumentException ( "Value cannot be null or whitespace." , nameof ( topic ) ) ;
5485 }
5586
87+ if ( producer == null )
88+ {
89+ throw new ArgumentNullException ( nameof ( producer ) ) ;
90+ }
91+
92+ _producer = producer ;
93+ Topic = topic ;
94+ _headerProvider = null ;
95+ }
96+
97+ public KafkaEventStreamPublisher (
98+ IProducer < TKey , TEvent > producer ,
99+ string topic ,
100+ IKafkaHeaderProvider headerProvider )
101+ {
102+ if ( string . IsNullOrWhiteSpace ( topic ) )
103+ {
104+ throw new ArgumentException ( "Value cannot be null or whitespace." , nameof ( topic ) ) ;
105+ }
106+
107+ if ( producer == null )
108+ {
109+ throw new ArgumentNullException ( nameof ( producer ) ) ;
110+ }
111+
56112 _producer = producer ;
57113 Topic = topic ;
114+ _headerProvider = headerProvider ;
58115 }
59116
60117 public string Topic { get ; }
61118
62119 public async Task PublishAsync ( TKey key , TEvent item , CancellationToken cancellationToken )
63120 {
64- await _producer . ProduceAsync (
65- Topic ,
66- new Message < TKey , TEvent >
121+ var message = new Message < TKey , TEvent >
122+ {
123+ Key = key ,
124+ Value = item
125+ } ;
126+
127+ if ( _headerProvider != null )
128+ {
129+ message . Headers = [ ] ;
130+ var headers = _headerProvider . GetHeaders ( ) ;
131+ if ( headers != null )
67132 {
68- Key = key ,
69- Value = item
70- } ,
71- cancellationToken ) ;
133+ foreach ( var header in headers )
134+ {
135+ if ( header == null || header . Key == null )
136+ {
137+ continue ;
138+ }
139+ message . Headers . Add ( header . Key , header . GetValueBytes ( ) ) ;
140+ }
141+ }
142+ }
143+
144+ await _producer . ProduceAsync ( Topic , message , cancellationToken ) ;
72145 }
73146
74147 protected virtual void Dispose ( bool disposing )
@@ -85,18 +158,12 @@ public void Dispose()
85158 GC . SuppressFinalize ( this ) ;
86159 }
87160
88- public class EventSerializer : Confluent . Kafka . ISerializer < TEvent >
161+ public class EventSerializer ( ISerializer < TEvent > serializer ) : Confluent . Kafka . ISerializer < TEvent >
89162 {
90- private readonly ISerializer < TEvent > _serializer ;
91-
92- public EventSerializer ( ISerializer < TEvent > serializer )
93- {
94- _serializer = serializer ;
95- }
96163 public byte [ ] Serialize ( TEvent data , SerializationContext context )
97164 {
98- return Encoding . UTF8 . GetBytes ( _serializer . Serialize ( data ) ) ;
165+ return Encoding . UTF8 . GetBytes ( serializer . Serialize ( data ) ) ;
99166 }
100167 }
101168 }
102- }
169+ }
0 commit comments