private static async Task <IClusterClient> InitializeWithRetries(ClientBuilderContext context)
        {
            var attempt             = 0;
            var stopwatch           = Stopwatch.StartNew();
            var clientClusterConfig = new ClientConfiguration();

            await Task.Delay(TimeSpan.FromSeconds(clientClusterConfig.DelayInitialConnectSeconds));

            var clientConfig = new ClientBuilder()
                               .UseConfiguration(context);

            context.ConfigureClientBuilder?.Invoke(clientConfig);

            var client = clientConfig.Build();
            await client.Connect(async ex =>
            {
                attempt++;
                if (attempt > clientClusterConfig.ConnectionRetry.TotalRetries)
                {
                    Console.WriteLine(ex.Message);
                    return(false);
                }

                var delay = RandomUtils.GenerateNumber(clientClusterConfig.ConnectionRetry.MinDelaySeconds, clientClusterConfig.ConnectionRetry.MaxDelaySeconds);
                Console.WriteLine("Client cluster {0} failed to connect. Attempt {1} of {2}. Retrying in {3}s.",
                                  context.ClusterId, attempt, clientClusterConfig.ConnectionRetry.TotalRetries, delay);
                await Task.Delay(TimeSpan.FromSeconds(delay));
                return(true);
            });

            Console.WriteLine("Client cluster connected successfully to silo {0} in {1:#.##}s.",
                              context.ClusterId, stopwatch.Elapsed.TotalSeconds);
            return(client);
        }
        public override async Task OnActivateAsync()
        {
            await base.OnActivateAsync();

            _hubContext = GrainFactory.GetHub <IUserNotificationHub>();

            var item = new UserNotification
            {
                MessageCount = 0
            };

            await Set(item);

            RegisterTimer(async x =>
            {
                State.UserNotification.MessageCount = RandomUtils.GenerateNumber(1, 100);
                await Set(State.UserNotification);

                var userNotification = new UserNotification
                {
                    MessageCount = item.MessageCount
                };

                await _hubContext.User(PrimaryKey).SendSignalRMessage("Broadcast", userNotification);
            }, State, TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3));
        }
Exemplo n.º 3
0
        public override async Task OnActivateAsync()
        {
            await base.OnActivateAsync();

            _hubContext = GrainFactory.GetHub <IHeroHub>();

            if (State.Hero == null)
            {
                // todo: use key data
                var keySplit = PrimaryKey.Split('/');
                _keyData.Tenant  = keySplit[1];
                _keyData.HeroKey = keySplit[2];
                var hero = await _heroDataClient.GetByKey(_keyData.HeroKey);
                await Set(hero);
            }

            var hubGroup    = _hubContext.Group($"hero:{_keyData.HeroKey}");
            var hubAllGroup = _hubContext.Group($"hero:all");

            var streamProvider = GetStreamProvider(Constants.STREAM_PROVIDER);
            var stream         = streamProvider.GetStream <Hero>(StreamConstants.HeroStream, $"hero:{_keyData.HeroKey}");

            RegisterTimer(async x =>
            {
                State.Hero.Health = RandomUtils.GenerateNumber(1, 100);

                await Task.WhenAll(
                    Set(State.Hero),
                    stream.OnNextAsync(State.Hero),
                    hubGroup.SendSignalRMessage("HeroChanged", State.Hero),
                    hubAllGroup.SendSignalRMessage("HeroChanged", State.Hero)
                    );
            }, State, TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3));
        }
Exemplo n.º 4
0
        public override async Task OnActivateAsync()
        {
            await base.OnActivateAsync();

            if (State.Hero == null)
            {
                // todo: use key data
                var keySplit = PrimaryKey.Split('/');
                _keyData.Tenant  = keySplit[1];
                _keyData.HeroKey = keySplit[2];
                var hero = await _heroDataClient.GetByKey(_keyData.HeroKey);
                await Set(hero);
            }

            var streamProvider = GetStreamProvider(Constants.STREAM_PROVIDER);
            var stream         = streamProvider.GetStream <Hero>(StreamConstants.HeroStream, $"hero:{PrimaryKey}");

            RegisterTimer(async x =>
            {
                State.Hero.Health = RandomUtils.GenerateNumber(1, 100);

                await Task.WhenAll(
                    Set(State.Hero),
                    stream.OnNextAsync(State.Hero)
                    );
            }, State, TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3));
        }
Exemplo n.º 5
0
        private static ISiloHostBuilder UseDockerSwarm(this ISiloHostBuilder siloHost)
        {
            var ips       = Dns.GetHostAddressesAsync(Dns.GetHostName()).Result;
            var defaultIp = ips.FirstOrDefault();

            return(siloHost
                   .ConfigureEndpoints(
                       defaultIp,
                       RandomUtils.GenerateNumber(30001, 30100),                  // todo: really needed random?
                       RandomUtils.GenerateNumber(20001, 20100),                  // todo: really needed random?
                       listenOnAnyHostAddress: true
                       ));
        }
Exemplo n.º 6
0
        public override async Task OnActivateAsync()
        {
            await base.OnActivateAsync();

            _hubContext = GrainFactory.GetHub <IHeroHub>();
            _keyData    = this.ParseKey <HeroKeyData>(HeroKeyData.Template);

            if (State.Entity == null)
            {
                var entity = await _heroDataClient.GetByKey(_keyData.Id);

                if (entity == null)
                {
                    return;
                }

                await Set(entity);
            }

            var hubGroup    = _hubContext.Group($"{_keyData.Tenant}/hero/{_keyData.Id}");
            var hubAllGroup = _hubContext.Group($"{_keyData.Tenant}/hero");             // all

            var streamProvider = GetStreamProvider(Constants.STREAM_PROVIDER);
            var stream         = streamProvider.GetStream <Hero>(StreamConstants.HeroStream, $"hero:{_keyData.Id}");

            RegisterTimer(async x =>
            {
                State.Entity.Health = RandomUtils.GenerateNumber(1, 100);

                await Task.WhenAll(
                    Set(State.Entity),
                    stream.OnNextAsync(State.Entity),
                    hubGroup.Send("HeroChanged", State.Entity),
                    hubAllGroup.Send("HeroChanged", State.Entity)
                    );
            }, State, TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3));
        }