コード例 #1
0
        public async Task GetAllUserIds()
        {
            using (var manager1 = CreateNewHubLifetimeManager <MyHub>())
                using (var manager2 = CreateNewHubLifetimeManager <MyHub>())
                    using (var client1 = new TestClient(userIdentifier: "userA"))
                        using (var client2 = new TestClient(userIdentifier: "userA"))
                            using (var client3 = new TestClient(userIdentifier: "userB"))
                            {
                                var userPartitioner = new DefaultClientSetPartitioner <IUserPartitionGrain>();

                                var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                                var connection2 = HubConnectionContextUtils.Create(client2.Connection);
                                var connection3 = HubConnectionContextUtils.Create(client3.Connection);

                                await manager1.OnConnectedAsync(connection1).OrTimeout();

                                await manager1.OnConnectedAsync(connection3).OrTimeout();

                                await manager2.OnConnectedAsync(connection2).OrTimeout();

                                await manager2.OnDisconnectedAsync(connection2).OrTimeout();

                                var result1 = await userPartitioner.GetAllClientSetIdsAsync(_fixture.TestCluster.Client, typeof(MyHub).GUID).OrTimeout();

                                Assert.Equal(2, result1.Count());

                                await manager1.OnDisconnectedAsync(connection3).OrTimeout();

                                var result2 = await userPartitioner.GetAllClientSetIdsAsync(_fixture.TestCluster.Client, typeof(MyHub).GUID).OrTimeout();

                                Assert.Single(result2);
                            }
        }
コード例 #2
0
        public OrleansHubLifetimeManager <THub> CreateNewHubLifetimeManager <THub>() where THub : Hub
        {
            var groupPartitioner = new DefaultClientSetPartitioner <IGroupPartitionGrain>();
            var userPartitioner  = new DefaultClientSetPartitioner <IUserPartitionGrain>();
            var options          = new OrleansOptions <THub> {
                ClusterClient = _fixture.TestCluster.Client
            };

            return(new OrleansHubLifetimeManager <THub>(Options.Create(options),
                                                        groupPartitioner,
                                                        userPartitioner,
                                                        new DefaultUserIdProvider(),
                                                        NullLogger <OrleansHubLifetimeManager <THub> > .Instance));
        }
コード例 #3
0
        public async Task GetAllGroupNames()
        {
            using (var manager1 = CreateNewHubLifetimeManager <MyHub>())
                using (var manager2 = CreateNewHubLifetimeManager <MyHub>())
                    using (var client1 = new TestClient())
                        using (var client2 = new TestClient())
                            using (var client3 = new TestClient())
                            {
                                var groupPartitioner = new DefaultClientSetPartitioner <IGroupPartitionGrain>();

                                var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                                var connection2 = HubConnectionContextUtils.Create(client2.Connection);
                                var connection3 = HubConnectionContextUtils.Create(client2.Connection);

                                await manager2.OnConnectedAsync(connection1).OrTimeout();

                                await manager2.OnConnectedAsync(connection2).OrTimeout();

                                await manager1.OnConnectedAsync(connection3).OrTimeout();

                                await manager1.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout();

                                await manager1.AddToGroupAsync(connection2.ConnectionId, "group").OrTimeout();

                                await manager2.AddToGroupAsync(connection3.ConnectionId, "group2").OrTimeout();

                                var result = await groupPartitioner.GetAllClientSetIdsAsync(_fixture.TestCluster.Client, typeof(MyHub).GUID).OrTimeout();

                                Assert.Equal(2, result.Count());

                                await manager1.OnDisconnectedAsync(connection2).OrTimeout();

                                // TODO
                                //var result1 = await groupPartitioner.GetClientSetIds(_fixture.TestCluster.Client).OrTimeout();
                                //Assert.Equal(2, result1.Count());

                                await manager2.OnDisconnectedAsync(connection3).OrTimeout();

                                var result2 = await groupPartitioner.GetAllClientSetIdsAsync(_fixture.TestCluster.Client, typeof(MyHub).GUID).OrTimeout();

                                Assert.Single(result2);
                            }
        }
コード例 #4
0
        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            stoppingToken.Register(async() =>
            {
                foreach (var item in clientDisposables.Values)
                {
                    item.Dispose();
                }
                foreach (var item in testClients.Values)
                {
                    item.Abort();
                }
                foreach (var item in managers.Values)
                {
                    item.Dispose();
                }
                await _testCluster.Client.Close();

                _logger.LogInformation(2, "stopped.");
            });



            Observable.FromAsync(() => Console.In.ReadLineAsync())
            .Repeat()
            .Where(value => !string.IsNullOrEmpty(value))
            .Select(value => value.Split(' '))
            .SubscribeOn(TaskPoolScheduler.Default)
            .Subscribe(async(string[] value) =>
            {
                await Task.CompletedTask;

                try
                {
                    switch (value[0])
                    {
                    case "m":
                        {
                            var managerId = value[1];

                            var groupPartitioner = new DefaultClientSetPartitioner <IGroupPartitionGrain>();
                            var userPartitioner  = new DefaultClientSetPartitioner <IUserPartitionGrain>();
                            managers[managerId]  = new OrleansHubLifetimeManager <SampleHub>(Options.Create(new OrleansOptions <SampleHub> {
                                ClusterClient = _testCluster.Client
                            }),
                                                                                             groupPartitioner,
                                                                                             userPartitioner,
                                                                                             new DefaultUserIdProvider(),
                                                                                             _loggerFactory.CreateLogger <OrleansHubLifetimeManager <SampleHub> >());

                            groupPartitioners[managerId] = groupPartitioner;
                            userPartitioners[managerId]  = userPartitioner;
                        }
                        break;

                    case "dm":
                        {
                            var managerId = value[1];

                            managers[managerId].Dispose();
                        }
                        break;

                    case "sa":
                        {
                            var managerId = value[1];

                            await managers[managerId].SendAllAsync("Hello", new object[] { "World" });
                        }
                        break;

                    case "sg":
                        {
                            var managerId = value[1];
                            var groupName = value[2];

                            await managers[managerId].SendGroupAsync(groupName, "Hello", new object[] { "World" });
                        }
                        break;

                    case "atg":
                        {
                            var managerId    = value[1];
                            var connectionId = value[2];
                            var groupName    = value[3];

                            await managers[managerId].AddToGroupAsync(testClients[connectionId].ConnectionId, groupName);
                        }
                        break;

                    case "rfg":
                        {
                            var managerId    = value[1];
                            var connectionId = value[2];
                            var groupName    = value[3];

                            await managers[managerId].RemoveFromGroupAsync(testClients[connectionId].ConnectionId, groupName);
                        }
                        break;

                    case "c":
                        {
                            var managerId    = value[1];
                            var connectionId = value[2];
                            var userId       = value[3];

                            var client = new TestClient(userIdentifier: userId);

                            var connection            = HubConnectionContextUtils.Create(client.Connection);
                            testClients[connectionId] = connection;

                            await managers[managerId].OnConnectedAsync(connection);

                            var disposable = Observable.Repeat(Observable.FromAsync(() => client.ReadAsync()))
                                             .ObserveOn(TaskPoolScheduler.Default)
                                             .Subscribe(message =>
                            {
                                var _message = message as InvocationMessage;
                                _logger.LogInformation($"Method {_message.Target}, Args {JsonConvert.SerializeObject(_message.Arguments)}");
                            });
                            clientDisposables[connectionId] = disposable;
                        }
                        break;

                    case "ga":
                        {
                            var managerId = value[1];

                            var result2 = await groupPartitioners[managerId].GetAllClientSetIdsAsync(_testCluster.Client, typeof(SampleHub).GUID);
                            var result3 = await userPartitioners[managerId].GetAllClientSetIdsAsync(_testCluster.Client, typeof(SampleHub).GUID);
                            _logger.LogInformation($"GroupNames: {JsonConvert.SerializeObject(result2)}, " +
                                                   $"UserIds: {JsonConvert.SerializeObject(result3)}");
                        }
                        break;

                    case "dc":
                        {
                            var managerId    = value[1];
                            var connectionId = value[2];

                            await managers[managerId].OnDisconnectedAsync(testClients[connectionId]);
                        }
                        break;


                    //case "sr":
                    //    {
                    //        var range = RangeFactory.CreateRange(uint.Parse(value[1]), uint.Parse(value[2]));
                    //        var subRanges = RangeFactory.GetSubRanges(range);
                    //        _logger.LogInformation($"subRanges: {JsonConvert.SerializeObject(subRanges)}");



                    //        //var id = Utils.CalculateIdHash(value[1]);
                    //        //_logger.LogInformation($"id: {id}");
                    //    }
                    //    break;
                    //case "ifr":
                    //    {
                    //        var fullRange = RangeFactory.CreateFullRange();
                    //        _logger.LogInformation($"{value[1]} in full range: {fullRange.InRange(uint.Parse(value[1]))}");
                    //    }
                    //    break;
                    //case "ir":
                    //    {
                    //        var range = RangeFactory.CreateRange(uint.Parse(value[1]), uint.Parse(value[2]));
                    //        _logger.LogInformation($"{value[3]} in range: {range.InRange(uint.Parse(value[3]))}");
                    //    }
                    //    break;
                    default:
                        break;
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "Exception onNext.");
                }
            },
                       error => _logger.LogError(error, "OnError."),
                       () => _logger.LogInformation("OnCompleted."));

            return(Task.CompletedTask);
        }