Esempio n. 1
0
        /// <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自检错误");
                }
            }

        }
Esempio n. 2
0
        //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服务开始");
            }
        }