Esempio n. 1
0
        public async Task <NullableValue> RegisterApplicationAsync(string applicationCode,
                                                                   CancellationToken cancellationToken = default(CancellationToken))
        {
            if (!_connectionManager.Ready)
            {
                return(NullableValue.Null);
            }

            var connection = _connectionManager.GetConnection();

            var client = new ApplicationRegisterService.ApplicationRegisterServiceClient(connection);

            return(await new Call(_logger, _connectionManager).Execute(async() =>
            {
                var applicationMapping = await client.applicationCodeRegisterAsync(
                    new Application {
                    ApplicationCode = applicationCode
                },
                    null, _config.GetTimeout(), cancellationToken);

                return new NullableValue(applicationMapping?.Application?.Value ?? 0);
            },
                                                                       () => NullableValue.Null,
                                                                       () => ExceptionHelpers.RegisterApplicationError));
        }
        protected override async Task Initializing(CancellationToken token)
        {
            var application = new Application {
                ApplicationCode = AgentConfig.ApplicationCode
            };
            var applicationRegisterService =
                new ApplicationRegisterService.ApplicationRegisterServiceClient(GrpcChannelManager.Instance.Channel);

            var applicationId = default(int?);

            while (!applicationId.HasValue || DictionaryUtil.IsNull(applicationId.Value))
            {
                var applicationMapping = await applicationRegisterService.applicationCodeRegisterAsync(application);

                applicationId = applicationMapping?.Application?.Value;
            }

            RemoteDownstreamConfig.Agent.ApplicationId = applicationId.Value;

            var instanceDiscoveryService =
                new InstanceDiscoveryService.InstanceDiscoveryServiceClient(GrpcChannelManager.Instance.Channel);

            var agentUUID    = Guid.NewGuid().ToString().Replace("-", "");
            var registerTime = DateTime.UtcNow.GetTimeMillis();

            var hostName = Dns.GetHostName();

            var osInfo = new OSInfo
            {
                Hostname  = hostName,
                OsName    = Environment.OSVersion.ToString(),
                ProcessNo = Process.GetCurrentProcess().Id
            };

            // todo fix Device not configured
            //var ipv4s = Dns.GetHostAddresses(hostName);
            //foreach (var ipAddress in ipv4s.Where(x => x.AddressFamily == AddressFamily.InterNetwork))
            //   osInfo.Ipv4S.Add(ipAddress.ToString());

            var applicationInstance = new ApplicationInstance
            {
                ApplicationId = applicationId.Value,
                AgentUUID     = agentUUID,
                RegisterTime  = registerTime,
                Osinfo        = osInfo
            };

            var applicationInstanceId = 0;

            while (DictionaryUtil.IsNull(applicationInstanceId))
            {
                var applicationInstanceMapping = await instanceDiscoveryService.registerInstanceAsync(applicationInstance);

                applicationInstanceId = applicationInstanceMapping.ApplicationInstanceId;
            }

            RemoteDownstreamConfig.Agent.ApplicationInstanceId = applicationInstanceId;
        }
        private async Task RegisterApplication(GrpcConnection availableConnection, CancellationToken token)
        {
            if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationId))
            {
                var application = new Application {
                    ApplicationCode = AgentConfig.ApplicationCode
                };
                var applicationRegisterService =
                    new ApplicationRegisterService.ApplicationRegisterServiceClient(availableConnection.GrpcChannel);

                var retry         = 0;
                var applicationId = 0;
                while (retry++ < 3 && DictionaryUtil.IsNull(applicationId))
                {
                    var applicationMapping = await applicationRegisterService.applicationCodeRegisterAsync(application);

                    applicationId = applicationMapping?.Application?.Value ?? 0;
                    if (!DictionaryUtil.IsNull(applicationId))
                    {
                        break;
                    }
                    await Task.Delay(500, token);
                }

                if (DictionaryUtil.IsNull(applicationId))
                {
                    _logger.Warning(
                        "Register application fail. Server response null.");
                    return;
                }

                _logger.Info(
                    $"Register application success. [applicationCode] = {application.ApplicationCode}. [applicationId] = {applicationId}");
                RemoteDownstreamConfig.Agent.ApplicationId = applicationId;
            }
        }
        protected override async Task Execute(CancellationToken token)
        {
            if (!DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationId) &&
                !DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationInstanceId))
            {
                return;
            }

            var availableConnection = GrpcConnectionManager.Instance.GetAvailableConnection();

            if (availableConnection == null)
            {
                _logger.Warning(
                    $"Register application fail. {GrpcConnectionManager.NotFoundErrorMessage}");
                return;
            }

            try
            {
                if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationId))
                {
                    var application = new Application {
                        ApplicationCode = AgentConfig.ApplicationCode
                    };
                    var applicationRegisterService =
                        new ApplicationRegisterService.ApplicationRegisterServiceClient(availableConnection
                                                                                        .GrpcChannel);
                    var applicationMapping = await applicationRegisterService.applicationCodeRegisterAsync(application);

                    await Task.Delay(TimeSpan.FromSeconds(1), token);

                    var applicationId = applicationMapping?.Application?.Value;
                    if (!applicationId.HasValue || DictionaryUtil.IsNull(applicationId.Value))
                    {
                        _logger.Warning(
                            "Register application fail. Server response null.");
                        return;
                    }

                    _logger.Info(
                        $"Register application success. [applicationCode] = {application.ApplicationCode}. [applicationId] = {applicationId.Value}");
                    RemoteDownstreamConfig.Agent.ApplicationId = applicationId.Value;
                }

                if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationInstanceId))
                {
                    var instanceDiscoveryService =
                        new InstanceDiscoveryService.InstanceDiscoveryServiceClient(availableConnection.GrpcChannel);

                    var agentUUID    = Guid.NewGuid().ToString("N");
                    var registerTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

                    var hostName = Dns.GetHostName();

                    var osInfo = new OSInfo
                    {
                        Hostname  = hostName,
                        OsName    = Environment.OSVersion.ToString(),
                        ProcessNo = Process.GetCurrentProcess().Id
                    };

                    // todo fix Device not configured
                    //var ipv4s = Dns.GetHostAddresses(hostName);
                    //foreach (var ipAddress in ipv4s.Where(x => x.AddressFamily == AddressFamily.InterNetwork))
                    //   osInfo.Ipv4S.Add(ipAddress.ToString());

                    var applicationInstance = new ApplicationInstance
                    {
                        ApplicationId = RemoteDownstreamConfig.Agent.ApplicationId,
                        AgentUUID     = agentUUID,
                        RegisterTime  = registerTime,
                        Osinfo        = osInfo
                    };

                    var applicationInstanceId = 0;
                    var retry = 0;

                    while (retry++ <= 3 && DictionaryUtil.IsNull(applicationInstanceId))
                    {
                        var applicationInstanceMapping =
                            await instanceDiscoveryService.registerInstanceAsync(applicationInstance);

                        await Task.Delay(TimeSpan.FromSeconds(1), token);

                        applicationInstanceId = applicationInstanceMapping.ApplicationInstanceId;
                    }

                    if (!DictionaryUtil.IsNull(applicationInstanceId))
                    {
                        RemoteDownstreamConfig.Agent.ApplicationInstanceId = applicationInstanceId;
                        _logger.Info(
                            $"Register application instance success. [applicationInstanceId] = {applicationInstanceId}");
                    }
                    else
                    {
                        _logger.Warning(
                            "Register application instance fail. Server response null.");
                    }
                }
            }
            catch (Exception exception)
            {
                _logger.Warning($"Try register application fail. {exception.Message}");
                availableConnection?.Failure();
            }
        }