示例#1
0
        public async Task MultipleSent(int count)
        {
            var minionLocator = new TestMinionLocator();

            using var host = QuickSetupTestHelper.BuildHost(
                      DatabaseType.SQLite,
                      RelationLocatorStrategy.SharedTable,
                      AppsettingsFilenames,
                      builder =>
            {
                builder.RegisterInstance(minionLocator)
                .As <IMinionLocator>()
                .SingleInstance();
            }, builder =>
                      builder.UseRabbitMQ(rabbitmq => rabbitmq.AsEventCenter())
                      );
            var container         = host.Services;
            var subscriberManager = container.GetRequiredService <IMQSubscriberManager>();
            await subscriberManager.StartAsync();

            var claptrapFactory = (ClaptrapFactory)container.GetRequiredService <IClaptrapFactory>();
            var id = new ClaptrapIdentity("1", Codes.Account);

            await using var scope = claptrapFactory.BuildClaptrapLifetimeScope(id);
            var eventCenter = scope.Resolve <IEventCenter>();
            var task        = Enumerable.Range(0, count)
                              .ToObservable()
                              .Select(version =>
            {
                var unitEvent     = UnitEvent.Create(id);
                unitEvent.Version = version;
                return(unitEvent);
            })
                              .Select(e => Observable.FromAsync(() => eventCenter.SendToMinionsAsync(id, e)))
                              .Merge(100)
                              .ToTask();
            await task;
            await Task.Delay(TimeSpan.FromSeconds(5));

            await subscriberManager.CloseAsync();

            await container.GetRequiredService <IMQSenderManager>().CloseAsync();

            await host.StopAsync();

            var receivedItems = minionLocator.Queue.ToArray();
            var itemGroup     = receivedItems
                                .GroupBy(x => x.Identity);

            foreach (var grouping in itemGroup)
            {
                grouping
                .Select(x => x.Event.Version)
                .Should()
                .BeEquivalentTo(Enumerable.Range(0, count));
            }
        }
        private IServiceProvider BuildService()
        {
            var host = QuickSetupTestHelper.BuildHost(
                DatabaseType,
                Strategy,
                AppsettingsFilenames);

            Host = host;
            OnContainerBuilt(host.Services).Wait();
            return(host.Services);
        }
示例#3
0
        public async Task Normal(CompressType compressType)
        {
            var random        = new Random();
            var minionLocator = new TestMinionLocator();

            using var host = QuickSetupTestHelper.BuildHost(
                      DatabaseType.SQLite,
                      RelationLocatorStrategy.SharedTable,
                      AppsettingsFilenames.Concat(new[]
                                                  { $"configs/rabbitmq/appsettings.{compressType.ToString("G").ToLower()}.json" }),
                      builder =>
            {
                builder.RegisterInstance(minionLocator)
                .As <IMinionLocator>()
                .SingleInstance();
            }, builder =>
                      builder.UseRabbitMQ(rabbitmq => rabbitmq.AsEventCenter())
                      );

            var container         = host.Services;
            var subscriberManager = container.GetRequiredService <IMQSubscriberManager>();
            await subscriberManager.StartAsync();

            var claptrapFactory = (ClaptrapFactory)container.GetRequiredService <IClaptrapFactory>();
            var id1             = new ClaptrapIdentity("1", Codes.Account);

            await using var scope = claptrapFactory.BuildClaptrapLifetimeScope(id1);
            var eventCenter = scope.Resolve <IEventCenter>();
            var eventData   = new AccountBalanceChangeEvent
            {
                Diff = random.Next(0, 1000)
            };
            var evt = new DataEvent(id1, Codes.AccountBalanceChangeEvent, eventData)
            {
                Version = 1
            };
            await eventCenter.SendToMinionsAsync(id1, evt);

            await Task.Delay(TimeSpan.FromSeconds(3));

            minionLocator.Queue.Count.Should().Be(2);
            var dic               = minionLocator.Queue.ToDictionary(x => x.Identity);
            var balanceMinionId   = new ClaptrapIdentity(id1.Id, Codes.AccountBalanceMinion);
            var balanceMinionItem = dic[balanceMinionId];

            AssertEvent(balanceMinionId, balanceMinionItem);

            var balanceHistoryMinionId   = new ClaptrapIdentity(id1.Id, Codes.AccountBalanceMinion);
            var balanceHistoryMinionItem = dic[balanceHistoryMinionId];

            AssertEvent(balanceHistoryMinionId, balanceHistoryMinionItem);

            await subscriberManager.CloseAsync();

            await container.GetRequiredService <IMQSenderManager>().CloseAsync();

            await host.StopAsync();

            void AssertEvent(ClaptrapIdentity minionId, ReceivedItem item)
            {
                var(id, e) = item;
                id.Should().BeEquivalentTo(minionId);
                e.Version.Should().Be(evt.Version);
                e.EventTypeCode.Should().Be(evt.EventTypeCode);
                e.Data.Should().BeOfType <AccountBalanceChangeEvent>();
                var data = (AccountBalanceChangeEvent)e.Data;

                data.Diff.Should().Be(eventData.Diff);
            }
        }