protected override async Task OnSetUp(IWindsorContainer container) { // Arrange await Transact(session => { session.Store(new WebsiteConfig(new[] { new WebsiteConfig.TeamNameAndLevel("FIF", "A") }, false, 1660, 2012)); Player[] players = new[] { new Player("Christer Liedholm", "*****@*****.**", Player.Status.Active, 0, null, new string[0], new PlayerItem { LicNbr = "M131061CHR01" }), new Player("Mathias Ernest", "*****@*****.**", Player.Status.Active, 0, null, new string[0], new PlayerItem { LicNbr = "M131061CHR01" }), new Player("Torbjörn Jensen", "*****@*****.**", Player.Status.Active, 0, null, new string[0], new PlayerItem { LicNbr = "M131061CHR01" }), new Player("Alf Kindblom", "*****@*****.**", Player.Status.Active, 0, null, new string[0], new PlayerItem { LicNbr = "M131061CHR01" }), new Player("Peter Sjöberg", "*****@*****.**", Player.Status.Active, 0, null, new string[0], new PlayerItem { LicNbr = "M131061CHR01" }), new Player("Lars Öberg", "*****@*****.**", Player.Status.Active, 0, null, new string[0], new PlayerItem { LicNbr = "M131061CHR01" }), new Player("Mikael Axelsson", "*****@*****.**", Player.Status.Active, 0, null, new string[0], new PlayerItem { LicNbr = "M131061CHR01" }), new Player("Hans Norbeck", "*****@*****.**", Player.Status.Active, 0, null, new string[0], new PlayerItem { LicNbr = "M131061CHR01" }), new Player("Lennart Axelsson", "*****@*****.**", Player.Status.Active, 0, null, new string[0], new PlayerItem { LicNbr = "M131061CHR01" }) }; foreach (Player player in players) { session.Store(player); } Roster roster = new( 2012, 1, 3048746, "Fredrikshof IF", "A", "Bowl-O-Rama", "Högdalen BK", new DateTime(2013, 4, 27), false, OilPatternInformation.Empty) { Players = players.Select(x => x.Id).ToList() }; session.Store(roster); rosterId = roster.Id; return(Task.CompletedTask); }); IBitsClient bitsClient = Mock.Of <IBitsClient>(); _ = Mock.Get(bitsClient) .Setup(x => x.GetMatchResults(3048746)) .Returns(BitsGateway.GetMatchResults(3048746)); _ = Mock.Get(bitsClient) .Setup(x => x.GetMatchScores(3048746)) .Returns(BitsGateway.GetMatchScores(3048746)); _ = Mock.Get(bitsClient) .Setup(x => x.GetHeadInfo(3048746)) .Returns(BitsGateway.GetHeadInfo(3048746)); _ = Mock.Get(bitsClient) .Setup(x => x.GetHeadResultInfo(3048746)) .Returns(BitsGateway.GetHeadResultInfo(3048746)); _ = container.Register(Component.For <IBitsClient>().Instance(bitsClient)); task = new(rosterId !, 123); PublishedTask publishedTask = Databases.Snittlistan.PublishedTasks.Add( PublishedTask.CreateImmediate( task, 1, Guid.NewGuid(), null, "test")); envelope = new( task, publishedTask.TenantId, "", publishedTask.CorrelationId, null, publishedTask.MessageId); }
public void PublishTask(TaskBase task, string createdBy) { Logger.Info("{createdBy} publish task {@task}", createdBy, task); PublishedTask publishedTask = databases.Snittlistan.PublishedTasks.Add( PublishedTask.CreateImmediate( task, currentTenant.TenantId, correlationId, causationId, createdBy)); try { HostingEnvironment.QueueBackgroundWorkItem(ct => PublishMessage(currentTenant, publishedTask.MessageId, ct)); } catch (Exception ex) { Logger.Error( ex, "QueueBackgroundWorkItem failed, using fallback (publish immediately)"); try { DoPublishMessage(currentTenant, publishedTask); } catch (Exception ex2) { Logger.Error(ex2); } } async void PublishMessage(Tenant tenant, Guid messageId, CancellationToken ct) { const int MaxTries = 10; using IDisposable logScope = NestedDiagnosticsLogicalContext.Push("QueueBackgroundWork"); using SnittlistanContext context = new(); try { for (int i = 0; i < MaxTries; i++) { Logger.Info("try #{try}", i); PublishedTask?publishedTask = await context.PublishedTasks.SingleOrDefaultAsync(x => x.MessageId == messageId); if (publishedTask == null) { Logger.Warn("message not found: {messageId}", messageId); await Task.Delay(300); } else { DoPublishMessage(tenant, publishedTask); return; } } throw new Exception($"max tries reached: {MaxTries}"); } catch (Exception ex) { Logger.Error(ex, "failed to publish message"); } } void DoPublishMessage(Tenant tenant, PublishedTask publishedTask) { using MsmqGateway msmqGateway = msmqFactory.Create(); using MsmqGateway.MsmqTransactionScope scope = msmqGateway.Create(); MessageEnvelope message = new( publishedTask.Task, publishedTask.TenantId, tenant.Hostname, publishedTask.CorrelationId, publishedTask.CausationId, publishedTask.MessageId); scope.Send(message); scope.Commit(); Logger.Info("published message {@message}", message); } }