예제 #1
0
        /// <summary>
        /// Обработчик старта ноды
        /// </summary>
        public void Started()
        {
            _status.AddCallback("test", action =>
            {
                if (action.PayLoad == null)
                {
                    _status.Next.Send(action.Message);
                }
                else
                {
                    _status.Next.Send(action.PayLoad);
                }
            });

            var apiService = _serviceProvider.GetRequiredService <IApiService>();

            // Отправляем информацию о старте и количестве акторов в ноде
            try
            {
                var url = string.Format("{0}/api/worker/started", _nodeSettings.ClusterUrl);
                apiService.PutOrPostRequest <NodeStarted, string>(url, new NodeStarted()
                {
                    ActorsCount = _nodeSettings.ActorsCount,
                    Host        = _nodeSettings.NodeUrl
                });
            }
            catch (Exception ex)
            {
                SendError(ex.ToString());
                _logger.Error(ex);
            }

            var cancellationTokenSource = new CancellationTokenSource();

            // Добавил простой heartbeat чтобы отслеживать на кластере существование нод
            TaskRepeater.Interval(TimeSpan.FromSeconds(_heartbeatInterval), () =>
            {
                try
                {
                    apiService.GetRequest <string>(string.Format("{0}/api/worker/ready/{1}", _nodeSettings.ClusterUrl, _nodeSettings.NodeUrl));
                }
                catch (Exception ex)
                {
                    SendError(ex.ToString());
                    _logger.Error(ex);
                }
            }, cancellationTokenSource.Token, true);
        }