using Confluent.Kafka;
using Microsoft.Extensions.Configuration;
using TrackCenter.Application.Services.Warning.Signals;
using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using Volo.Abp.DependencyInjection;
namespace TrackCenter.Application.Kafka;
///
/// 预警信号发布者
///
public sealed class WarningSignalPublisher : IDisposable, ISingletonDependency
{
private readonly IProducer _producer;
private readonly IProducer _dlxProducer;
private readonly string env;
public WarningSignalPublisher(IProducer producer, IProducer dlxProducer, IConfiguration conf)
{
_producer = producer;
_dlxProducer = dlxProducer;
env = "-" + conf.GetValue("Environment")!.ToLower();
}
public void PublishSignal(WarningSignalType type, List tracks)
{
foreach (var track in tracks)
PublishSignal(type, track);
}
public void PublishSignal(WarningSignalType type, TrackDetailsIndex track)
{
_producer.Produce(GlobalConst.WarningKafkaTopic + env, new Message
{
Key = new WarningSignalKey(type, track.OrderId),
Value = WarningSignal.FromTrack(track, type)
});
}
public Task PublishSignalAsync(Message msg, CancellationToken ct = default)
{
return _producer.ProduceAsync(GlobalConst.WarningKafkaTopic + env, msg, ct);
}
public Task PublishDlxSignalAsync(Message message, CancellationToken ct = default)
{
return _dlxProducer.ProduceAsync(GlobalConst.WarningDLXKafkaTopic + env, message, ct);
}
public void Dispose()
{
_producer.Dispose();
_dlxProducer.Dispose();
}
}