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); }
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(); }
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); }
private bool IsBrokerExists(string brokerName) { RabbitMQConnectionSetting connectionSetting = _options.GetConnectionSetting(brokerName); if (connectionSetting == null) { _logger.LogCritical($"当前没有broker为{brokerName}的RabbitMQ。"); return(false); } return(true); }
//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); }
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); }
public HistoryTaskManager(RabbitMQConnectionSetting connectionSetting, IRabbitMQConnectionManager connectionManager, IRedisDatabase redis, ILogger logger) : base(connectionSetting, connectionManager, redis, logger) { }