public bool TryGet <T>(string key, out T value) { value = default(T); if (!IsRunning) { return(false); } var path = BuildZooKeeperPath(this._configInfo.ConfigName.ToLower(), this._configInfo.VersionInfo, this._envInfo.DeployKey.ToLower(), key.ToLower()); try { if (_client.EnsureExists(path, false)) { var data = _client.EnsureGetData(path); if (data != null) { value = Deserialize <T>(data); return(true); } } else { var defautEnv = BuildZooKeeperPath(this._configInfo.ConfigName.ToLower(), this._configInfo.VersionInfo, _defaultEvnKey, key.ToLower()); if (_client.EnsureExists(defautEnv, false)) { var data = _client.EnsureGetData(defautEnv); if (data != null) { value = Deserialize <T>(data); return(true); } } } } catch (IkZooKeeperNet.KeeperException.NoNodeException) { } catch (Exception ex) { logger.Warn(string.Format("配置获取失败,配置名称:{0},配置版本:{1},key:{2}", this._configInfo.ConfigName, this._configInfo.VersionInfo, key), ex); } return(false); }
protected override void ShutDownService() { _logger.Info("分布式订阅服务开始关闭"); sourceArrays.CompleteAdding(); var list = workerThreads.ToList(); foreach (var item in list) { item.Stop(); } while (workerThreads.Count > 0) { Thread.Sleep(200); } _logger.Info("心跳检查及通信清理服务关闭完成"); var topics = LocalSubscribeContext.Current.GetDistributedSubscriptionTopics(); var address = string.Format("{0}:{1}", GetIntranetIp(), this._port); foreach (var topic in topics) { var path = BuildZooKeeperPath(topic, address); try { if (_client.EnsureExists(path, false)) { _client.EnsureDelete(path); } _logger.Info(string.Format("取消订阅完成,主题:{0},地址:{1}", topic, address)); RemoveEventPublisher(topic, address); } catch (Exception ex) { _logger.Error(string.Format("清理消费错误,主题:{0},地址:{1}", topic, address), ex); } } _logger.Info(string.Format("已取消订阅{0}个", topics.Count)); this._client.Dispose(); if (this._islistener) { host.Close(); } _logger.Info("分布式订阅服务关闭完成"); }
protected override void StartService() { int port = ConfigManager.Instance.Get <int>("event_listener_port"); if (port > 0) { this._port = port; } int heartbeatCheckMilliseconds = ConfigManager.Instance.Get <int>("event_heartbeat_check"); if (heartbeatCheckMilliseconds > 0) { this._heartbeatCheckMilliseconds = heartbeatCheckMilliseconds; } string eventServerAddress = ConfigManager.Instance.Get <string>("event_server_address"); if (string.IsNullOrEmpty(eventServerAddress)) { throw new EventException("事件服务地址不能为空"); } this._eventServerAddress = eventServerAddress; this._client = new IkZooKeeperClient(eventServerAddress, TimeSpan.FromSeconds(15), null); _logger.Info(string.Format("开始分布式事件订阅服务,监听端口:{0},心跳检查时间:{1},事件服务地址:{2}", this._port, this._heartbeatCheckMilliseconds, eventServerAddress)); Task.Run(() => { foreach (var item in sourceArrays.GetConsumingEnumerable()) { if (item.ClearType == ClearType.Address) { var publisher = GetEventPublisher(item.Topic, item.Address); bool flag = false; try { publisher.EventPublisher.Heartbeat(); flag = true; break; } catch { } if (!flag) { var path = BuildZooKeeperPath(item.Topic, item.Address); try { if (_client.EnsureExists(path, false)) { _client.EnsureDelete(path); } if (!RemoveEventPublisher(item.Topic, item.Address)) { _logger.Error(string.Format("清理通信通道错误,主题:{0},地址:{1}", item.Topic, item.Address)); } } catch (Exception ex) { _logger.Error(string.Format("清理消费错误,主题:{0},地址:{1}", item.Topic, item.Address), ex); } } } else { var path = BuildZooKeeperPath(item.Topic); try { if (_client.EnsureExists(path, false)) { _client.EnsureDelete(path); } } catch (Exception ex) { _logger.Error(string.Format("清理消费错误,主题:{0}", item.Topic), ex); } } } }); CheckTopicServerHeartbeat(); EnsureSubscribe(); var worker = AddWorkerThread(); worker.Start(); }