コード例 #1
0
    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);
    }
コード例 #2
0
    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);
        }
    }