/// <summary> /// 自检,配合 RabbitMQ 内部自动重连机制 /// </summary> private async Task SelfCheck(CancellationToken token) { while (!token.IsCancellationRequested) { Run(); await Task.Delay(TimeSpan.FromSeconds(60)); } void Run() { try { int error = 0, reconnect = 0; _logger.Debug($"正在执行自检"); foreach (var item in Services) { for (int i = 0; i < item.Channels.Count; i++) { var c = item.Channels[i]; if (c.Connection == null || !c.Connection.IsOpen) { error++; _logger.Information($"{c.ExchangeName} {c.QueueName} {c.Routekey} 重新创建消费者"); try { c.Stop(); var manager = new MqChannelManager(MqGlobleConfig.DefaultMQConfig); var channel = manager.CreateReceiveChannel(c.ExchangeType, c.ExchangeName, c.QueueName, c.Routekey, c.OnReceivedCallback); item.Channels.Remove(c); item.Channels.Add(channel); _logger.Information($"{c.ExchangeName} {c.QueueName} {c.Routekey} 重新创建完成"); reconnect++; } catch (Exception ex) { _logger.Error(ex, ex.Message); } } } } _logger.Debug($"自检完成,错误数:{error},重连成功数:{reconnect}"); } catch (Exception ex) { _logger.Error(ex, "mq自检错误"); } } }
//public MqConsumerChannel CreateChannel(string queue, string routeKey, string exchangeType) //{ // MqConnection conn = new MqConnection(Config, vHost); // MqChannelManager cm = new MqChannelManager(conn); // MqConsumerChannel channel = cm.CreateReceiveChannel(exchangeType, ExchangeName, queue, routeKey); // return channel; //} /// <summary> /// 启动订阅 /// </summary> public void Start() { if (!_started) { if (!Queues.Exists(x => x.QueueName == QueueName)) { Queues.Add(new QueueInfo(QueueName, OnReceived)); } var manager = new MqChannelManager(Config); foreach (var item in Queues) { MqConsumerChannel channel = manager.CreateReceiveChannel(item.ExchangeType, this.ExchangeName, item.QueueName, item.RouterKey, item.OnReceived); this.Channels.Add(channel); } _started = true; Log.Information("mq服务开始"); } }