コード例 #1
0
        private IConnection CreateNewConnection(string brokerName)
        {
            IConnection connection;
            RabbitMQConnectionSetting connectionSetting = _options.GetConnectionSetting(brokerName);

            if (connectionSetting == null)
            {
                Exception ex = new Exception($"无法找到RabbitMQ ,没有对应broker名字的配置,brokername:{brokerName}");
                _logger.LogCritical(ex, $"RabbitMQ 配置不对,找不到brokername为{brokerName}的配置");

                throw ex;
            }

            //TODO: add polly here, make sure the connection is established, or just keep trying
            //TODO: add log here

            ConnectionFactory connectionFactory = new ConnectionFactory
            {
                Uri = new Uri(connectionSetting.ConnectionString),
                NetworkRecoveryInterval  = TimeSpan.FromSeconds(_options.NetworkRecoveryIntervalSeconds),
                AutomaticRecoveryEnabled = true
            };

            connection = connectionFactory.CreateConnection();

            connection.CallbackException       += Connection_CallbackException;
            connection.ConnectionBlocked       += Connection_ConnectionBlocked;
            connection.ConnectionUnblocked     += Connection_ConnectionUnblocked;
            connection.RecoverySucceeded       += Connection_RecoverySucceeded;
            connection.ConnectionRecoveryError += Connection_ConnectionRecoveryError;
            connection.ConnectionShutdown      += Connection_ConnectionShutdown;

            return(connection);
        }
コード例 #2
0
        public ConsumeTaskManager(string eventType, IEventHandler eventHandler, RabbitMQConnectionSetting connectionSetting, IRabbitMQConnectionManager connectionManager, IRedisDatabase redis, ILogger logger)
        {
            _redis             = redis;
            _eventType         = eventType.ThrowIfNull(nameof(eventType));
            _handler           = eventHandler.ThrowIfNull(nameof(eventHandler));
            _logger            = logger.ThrowIfNull(nameof(logger));
            _connectionManager = connectionManager.ThrowIfNull(nameof(connectionManager));
            _connectionSetting = connectionSetting.ThrowIfNull(nameof(connectionSetting));

            Restart();
        }
コード例 #3
0
        protected RabbitMQAndDistributedQueueDynamicTaskManager(RabbitMQConnectionSetting connectionSetting, IRabbitMQConnectionManager connectionManager, IRedisDatabase redis, ILogger logger)
        {
            _logger            = logger;
            _connectionManager = connectionManager;
            _redis             = redis;
            _connectionSetting = connectionSetting;

            int taskCount = EstimatedTaskNumber;

            AddTaskAndStart(taskCount > MaxWorkerThread() ? MaxWorkerThread() : taskCount);
        }
コード例 #4
0
        private bool IsBrokerExists(string brokerName)
        {
            RabbitMQConnectionSetting connectionSetting = _options.GetConnectionSetting(brokerName);

            if (connectionSetting == null)
            {
                _logger.LogCritical($"当前没有broker为{brokerName}的RabbitMQ。");

                return(false);
            }

            return(true);
        }
コード例 #5
0
        //TODO: 考虑让PublishManager和HistoryManager独立
        //TODO: 考虑用redis替代rabbitmq

        //private void NotifyPublishToRabbitMQ(string brokerName)
        //{
        //    //让 broker 名字为brokerName的 publishmanager开始工作
        //    //publishmanager开始创建Task, publishmanager

        //    //这里已经确保brokerName是存在的了,之前再PublishAsync里已经检查过

        //    _publishManagers[brokerName].NotifyInComming();
        //    _historyManager[brokerName].NotifyInComming();
        //}

        #endregion

        #region Subscribe

        public void SubscribeHandler(string brokerName, string eventType, IEventHandler eventHandler)
        {
            if (!IsBrokerExists(brokerName))
            {
                throw new ArgumentException($"当前没有broker为{brokerName}的RabbitMQ。");
            }

            if (_consumeManager.ContainsKey(eventType))
            {
                string message = $"已经存在相同类型的EventHandler了,eventType : {eventType}";
                _logger.LogCritical(message);

                throw new Exception(message);
            }

            RabbitMQConnectionSetting connectionSetting = _options.GetConnectionSetting(brokerName);

            ConsumeTaskManager manager = new ConsumeTaskManager(eventType, eventHandler, connectionSetting, _connectionManager, _redis, _consumeTaskManagerLogger);

            _consumeManager.Add(eventType, manager);
        }
コード例 #6
0
        public async Task <bool> PublishAsync(string brokerName, EventMessage eventMessage)
        {
            //大量Request线程放入缓存池中,离开
            //缓存池内容不能丢,所以用抗击打的Redis来存储
            //注意取消息后需要从kvstore删除

            if (!IsBrokerExists(brokerName))
            {
                throw new Exception($"Not exist rabbit broker:{brokerName}");
            }

            EventMessageEntity        eventEntity       = new EventMessageEntity(eventMessage.Type, eventMessage.JsonData);
            RabbitMQConnectionSetting connectionSetting = _options.GetConnectionSetting(brokerName);

            //推送到一个以broker命名的队列中
            await _redis.PushAsync(redisInstanceName : connectionSetting.RedisInstanceName, queueName : brokerName, data : eventEntity);

            //NotifyPublishToRabbitMQ(brokerName);

            return(true);
        }
コード例 #7
0
 public HistoryTaskManager(RabbitMQConnectionSetting connectionSetting, IRabbitMQConnectionManager connectionManager, IRedisDatabase redis, ILogger logger)
     : base(connectionSetting, connectionManager, redis, logger)
 {
 }