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); }
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); } }