コード例 #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));
            }
        }
コード例 #2
0
        static async Task Main(string[] args)
        {
            var configBuilder = new ConfigurationBuilder();
            var config        = configBuilder.AddJsonFile(Path.Combine("configs", "appsettings.json"))
                                .AddEnvironmentVariables()
                                .AddCommandLine(args)
                                .Build();

            var options = new TestConsoleOptions();

            config.Bind(nameof(TestConsoleOptions), options);

            const RelationLocatorStrategy strategy = RelationLocatorStrategy.SharedTable;
            var host = QuickSetupTestHelper.BuildHost(options.DatabaseType,
                                                      strategy,
                                                      Enumerable.Empty <string>(),
                                                      containerBuilder =>
            {
                containerBuilder.RegisterModule <StorageTestConsoleModule>();
                containerBuilder.RegisterModule <StorageSetupModule>();
            }, services => { },
                                                      hostBuilder =>
            {
                hostBuilder.ConfigureServices(services =>
                {
                    services.AddOptions <TestConsoleOptions>()
                    .Configure(consoleOptions => config.Bind(nameof(TestConsoleOptions), consoleOptions));
                });
            });
            var serviceProvider = host.Services;

            await using var scope = serviceProvider.GetService <ILifetimeScope>();
            var logger = scope !.Resolve <ILogger <Program> >();

            try
            {
                var   service = scope.ResolveKeyed <ITestJob>(options.Job);
                await service !.RunAsync();
            }
            catch (Exception e)
            {
                logger.LogError(e, "error while storage test");
            }
        }
コード例 #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);
            }
        }