22using System . Diagnostics . CodeAnalysis ;
33using System . Threading . Tasks ;
44using Confluent . Kafka ;
5+ using Microsoft . Extensions . Logging ;
56using Microsoft . Extensions . Options ;
67using NewRelic . Api . Agent ;
78using PollingOutboxPublisher . ConfigOptions ;
@@ -13,13 +14,26 @@ namespace PollingOutboxPublisher.Coordinators.Services;
1314public sealed class KafkaProducer : IKafkaProducer
1415{
1516 private IProducer < string , string > _producer ;
17+ private Kafka _kafkaConfiguration ;
18+ private readonly ILogger < KafkaProducer > _logger ;
1619
17- public KafkaProducer ( IOptions < Kafka > kafkaOptions )
20+ public KafkaProducer ( IOptionsMonitor < Kafka > kafkaOptionsMonitor , ILogger < KafkaProducer > logger )
1821 {
19- var kafkaConfiguration = kafkaOptions . Value ;
20- BuildProducer ( kafkaConfiguration ) ;
22+ _logger = logger ;
23+ _kafkaConfiguration = kafkaOptionsMonitor . CurrentValue ;
24+ kafkaOptionsMonitor . OnChange ( OnKafkaConfigChanged ) ;
25+ BuildProducer ( _kafkaConfiguration ) ;
2126 }
2227
28+ private void OnKafkaConfigChanged ( Kafka newKafkaConfig )
29+ {
30+ if ( ! newKafkaConfig . ReloadOnChange ) return ;
31+
32+ _logger . LogInformation ( "Kafka configuration changed" ) ;
33+ _kafkaConfiguration = newKafkaConfig ;
34+ BuildProducer ( _kafkaConfiguration ) ;
35+ }
36+
2337 private void BuildProducer ( Kafka kafka )
2438 {
2539 var config = new ProducerConfig
@@ -38,6 +52,12 @@ private void BuildProducer(Kafka kafka)
3852 MessageMaxBytes = kafka . MessageMaxBytes ?? 30000000 ,
3953 Acks = kafka . Acks ?? Acks . Leader
4054 } ;
55+
56+ if ( _producer != null )
57+ {
58+ _producer . Flush ( TimeSpan . FromSeconds ( 10 ) ) ;
59+ _producer . Dispose ( ) ;
60+ }
4161 _producer = new ProducerBuilder < string , string > ( config ) . Build ( ) ;
4262 }
4363
0 commit comments