修改rabbit
parent
ddf1f27bf9
commit
2b18e0089b
|
|
@ -9,173 +9,84 @@ namespace OpenAuth.WebApi.Model.RabbitMQService
|
|||
{
|
||||
public class RabbitMqListenerService : BackgroundService
|
||||
{
|
||||
private readonly ConnectionFactory _factory;
|
||||
private readonly ILogger<RabbitMqListenerService> _logger;
|
||||
private readonly DaHuaAiApp _app;
|
||||
private IConnection _connection;
|
||||
private IChannel _channel;
|
||||
private readonly Dictionary<string, string> _queueRoutingMap = new();
|
||||
private readonly object _lock = new();
|
||||
private readonly List<QueueBinding> _bindings = new();
|
||||
private readonly ILogger<RabbitMqListenerService> _logger;
|
||||
private DaHuaAiApp _app;
|
||||
|
||||
private readonly ConnectionFactory _factory = new()
|
||||
{
|
||||
HostName = "123.132.248.154",
|
||||
UserName = "DHCloudg1",
|
||||
Password = "Cloud0#4fCraQrm",
|
||||
Port = 9103
|
||||
};
|
||||
|
||||
public RabbitMqListenerService(ILogger<RabbitMqListenerService> logger, DaHuaAiApp app)
|
||||
{
|
||||
_logger = logger;
|
||||
_app = app;
|
||||
_factory = new ConnectionFactory
|
||||
{
|
||||
HostName = "123.132.248.154",
|
||||
UserName = "DHCloudg1",
|
||||
Password = "Cloud0#4fCraQrm",
|
||||
Port = 9103
|
||||
//HostName = "localhost",
|
||||
//UserName = "guest",
|
||||
//Password = "guest",
|
||||
//Port = 5672
|
||||
};
|
||||
}
|
||||
public async Task AddQueueBindingAsync(string exchange, string exchangeType, string routingKey)
|
||||
{
|
||||
_bindings.Add(new QueueBinding
|
||||
{
|
||||
Exchange = exchange,
|
||||
ExchangeType = exchangeType,
|
||||
RoutingKey = routingKey
|
||||
});
|
||||
|
||||
if (_channel != null)
|
||||
{
|
||||
await BindQueueAsync(_channel, exchange, exchangeType, routingKey);
|
||||
}
|
||||
}
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
_connection = await _factory.CreateConnectionAsync(stoppingToken);
|
||||
_channel = await _connection.CreateChannelAsync();
|
||||
//await BindQueueAsync(_channel, "processing_event", "topic", "event.trafficJunction.1.sdhc");
|
||||
var queueOk = await _channel.QueueDeclareAsync(queue: "",
|
||||
durable: false,
|
||||
exclusive: true,
|
||||
autoDelete: true);
|
||||
//await _channel.QueueBindAsync(queueOk.QueueName, "processing_event", "event.eventNotAlarm.picture.1.#");
|
||||
await _channel.QueueBindAsync(queueOk.QueueName, "processing_event", "event.behaviorAlarm.picture.1.#");
|
||||
await _channel.QueueBindAsync(queueOk.QueueName, "storage_event", "event.trafficEvent.1.#");
|
||||
var consumer = new AsyncEventingBasicConsumer(_channel);
|
||||
consumer.ReceivedAsync += async (sender, ea) =>
|
||||
_logger.LogInformation("RabbitMQ listener starting...");
|
||||
|
||||
while (!stoppingToken.IsCancellationRequested)
|
||||
{
|
||||
|
||||
var body = ea.Body.ToArray();
|
||||
var message = Encoding.UTF8.GetString(body);
|
||||
//Console.WriteLine($"接收数据[processing_event]: {message}");
|
||||
// Exchange 来做不同处理
|
||||
switch (ea.Exchange)
|
||||
try
|
||||
{
|
||||
case "processing_event":
|
||||
await _app.AddDaHuaImg(message);
|
||||
break;
|
||||
case "storage_event":
|
||||
await _app.AddDaHuaSmokeDetectionImg(message);
|
||||
break;
|
||||
default:
|
||||
Console.WriteLine($"[Other:{ea.RoutingKey}] {message}");
|
||||
break;
|
||||
// 建立连接
|
||||
_connection = await _factory.CreateConnectionAsync(stoppingToken);
|
||||
_channel = await _connection.CreateChannelAsync();
|
||||
|
||||
_logger.LogInformation("RabbitMQ connected successfully.");
|
||||
|
||||
await StartConsumeAsync(_channel, stoppingToken);
|
||||
|
||||
// 阻塞直到断开
|
||||
await Task.Delay(Timeout.Infinite, stoppingToken);
|
||||
}
|
||||
|
||||
await Task.Yield();
|
||||
};
|
||||
|
||||
await _channel.BasicConsumeAsync("", autoAck: true, consumer);
|
||||
//foreach (var binding in _bindings)
|
||||
//{
|
||||
// await BindQueueAsync(_channel, binding.Exchange, binding.ExchangeType, binding.RoutingKey);
|
||||
//}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "RabbitMQ connection failed. Retrying in 5 seconds...");
|
||||
await Task.Delay(5000, stoppingToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task BindQueueAsync(IChannel channel, string exchange, string exchangeType, string routingKey)
|
||||
private async Task StartConsumeAsync(IChannel channel, CancellationToken token)
|
||||
{
|
||||
//await channel.ExchangeDeclareAsync(exchange, exchangeType, durable: true);
|
||||
//await channel.QueueDeclareAsync("", durable: true, exclusive: false, autoDelete: false);
|
||||
//var queueOk = await _channel.QueueDeclareAsync(queue: "",
|
||||
// durable: false,
|
||||
// exclusive: true,
|
||||
// autoDelete: true);
|
||||
//await channel.QueueBindAsync(queueOk.QueueName, exchange, routingKey);
|
||||
var q = await channel.QueueDeclareAsync("", false, true, true);
|
||||
await channel.QueueBindAsync(q.QueueName, "processing_event", "event.behaviorAlarm.picture.1.#");
|
||||
await channel.QueueBindAsync(q.QueueName, "storage_event", "event.trafficEvent.1.#");
|
||||
|
||||
var consumer = new AsyncEventingBasicConsumer(channel);
|
||||
consumer.ReceivedAsync += async (sender, ea) =>
|
||||
consumer.ReceivedAsync += async (_, ea) =>
|
||||
{
|
||||
|
||||
var body = ea.Body.ToArray();
|
||||
var message = Encoding.UTF8.GetString(body);
|
||||
Console.WriteLine($"[processing_event]: {message}");
|
||||
// Exchange 来做不同处理
|
||||
switch (ea.Exchange)
|
||||
var message = Encoding.UTF8.GetString(ea.Body.ToArray());
|
||||
try
|
||||
{
|
||||
case "processing_event":
|
||||
Console.WriteLine($"[processing_event]: {message}");
|
||||
break;
|
||||
case "thing_event":
|
||||
Console.WriteLine($"[thing_event] {message}");
|
||||
break;
|
||||
default:
|
||||
Console.WriteLine($"[Other:{ea.RoutingKey}] {message}");
|
||||
break;
|
||||
switch (ea.Exchange)
|
||||
{
|
||||
case "processing_event":
|
||||
await _app.AddDaHuaImg(message);
|
||||
break;
|
||||
case "storage_event":
|
||||
await _app.AddDaHuaSmokeDetectionImg(message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "处理消息失败");
|
||||
}
|
||||
|
||||
await Task.Yield();
|
||||
};
|
||||
|
||||
await channel.BasicConsumeAsync("", autoAck: true, consumer);
|
||||
}
|
||||
//public async Task AddListenerAsync(string exchange, string exchangeType, string routingKey)
|
||||
//{
|
||||
// _connection = await _factory.CreateConnectionAsync();
|
||||
await channel.BasicConsumeAsync(q.QueueName, autoAck: true, consumer);
|
||||
|
||||
// foreach (var binding in _bindings)
|
||||
// {
|
||||
// var channel = await _connection.CreateChannelAsync();
|
||||
|
||||
// // 声明交换机
|
||||
// await channel.ExchangeDeclareAsync(binding.Exchange, binding.ExchangeType, durable: true);
|
||||
// await channel.QueueDeclareAsync("", durable: true, exclusive: false, autoDelete: false);
|
||||
// // 绑定队列到交换机
|
||||
// await channel.QueueBindAsync(queue: "", exchange: binding.Exchange, routingKey: binding.RoutingKey);
|
||||
|
||||
// var consumer = new AsyncEventingBasicConsumer(channel);
|
||||
// consumer.ReceivedAsync += async (model, ea) =>
|
||||
// {
|
||||
// var body = ea.Body.ToArray();
|
||||
// var message = Encoding.UTF8.GetString(body);
|
||||
|
||||
// using var scope = _serviceProvider.CreateScope();
|
||||
|
||||
// foreach (var handler in handlers)
|
||||
// {
|
||||
// await handler.HandleMessageAsync(binding.Exchange, ea.RoutingKey, message);
|
||||
// }
|
||||
|
||||
// await channel.BasicAckAsync(ea.DeliveryTag, multiple: false);
|
||||
// };
|
||||
// await channel.BasicConsumeAsync(queue: "", autoAck: false, consumer: consumer);
|
||||
|
||||
// _channels.Add(channel);
|
||||
// }
|
||||
//}
|
||||
|
||||
//public async ValueTask DisposeAsync()
|
||||
//{
|
||||
// foreach (var channel in _channels)
|
||||
// {
|
||||
// if (channel != null)
|
||||
// await channel.CloseAsync();
|
||||
// }
|
||||
// if (_connection != null)
|
||||
// await _connection.CloseAsync();
|
||||
//}
|
||||
private class QueueBinding
|
||||
{
|
||||
public string Exchange { get; set; } = "";
|
||||
public string ExchangeType { get; set; } = "";
|
||||
public string RoutingKey { get; set; } = "";
|
||||
_logger.LogInformation("RabbitMQ Consumer started.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue