using RabbitMQ.Client; using System.Text; namespace OpenAuth.WebApi.Model.RabbitMQService { public class RabbitMqSender : IAsyncDisposable { private readonly IConnection _connection; private readonly IChannel _channel; private const string ExchangeName = "mps_event"; private const string ExchangeType = "topic"; public RabbitMqSender(IConnection connection, IChannel channel) { _connection = connection; _channel = channel; } public static async Task CreateAsync(string hostName, int port, string userName, string password) { var factory = new ConnectionFactory() { HostName = hostName, UserName = userName, Password = password, Port = port, AutomaticRecoveryEnabled = true, // 自动重连 NetworkRecoveryInterval = TimeSpan.FromSeconds(5), }; var connection = await factory.CreateConnectionAsync(); var channel = await connection.CreateChannelAsync(); await channel.ExchangeDeclareAsync(exchange: ExchangeName, type: ExchangeType, durable: true); //await channel.QueueDeclareAsync("sdhc", durable: true, exclusive: false, autoDelete: false); var queueOk = await channel.QueueDeclareAsync(queue: "", durable: false, exclusive: true, autoDelete: true); await channel.QueueBindAsync(queueOk.QueueName, "mps_event", "event.capturePic.1.sdhc04"); return new RabbitMqSender(connection, channel); } public async Task SendAsync(string routeKey, string message) { var body = Encoding.UTF8.GetBytes(message); var properties = new BasicProperties() { Persistent = true }; // 监听 BasicReturn 事件 _channel.BasicReturnAsync += (sender, args) => { var returnedMessage = Encoding.UTF8.GetString(args.Body.ToArray()); Console.WriteLine($"[BasicReturn] Message returned: {returnedMessage}"); Console.WriteLine($"ReplyCode: {args.ReplyCode}, ReplyText: {args.ReplyText}"); Console.WriteLine($"Exchange: {args.Exchange}, RoutingKey: {args.RoutingKey}"); return Task.CompletedTask; }; await _channel.BasicPublishAsync(exchange: "mps_event", routingKey: routeKey, mandatory: true, basicProperties: properties, body: body); Console.WriteLine($"[RabbitMQ] 已发送到routeKey {routeKey}:{message}"); } public async ValueTask DisposeAsync() { if (_channel != null) await _channel.CloseAsync(); if (_connection != null) await _connection.CloseAsync(); } } }