示例#1
0
        public async Task RunAsync_SubProcessListSupplied_AllAreRun(int processCount)
        {
            // arrange
            var processId    = 0;
            var expectedKeys = Enumerable.Range(1, processCount);
            var dict         = new ConcurrentDictionary <int, DateTime>();

            _fixture.Register(() =>
            {
                var process = A.Fake <IProcess>();
                A.CallTo(() => process.RunAsync(CancellationToken.None)).ReturnsLazily(() =>
                {
                    var id = Interlocked.Increment(ref processId);
                    dict.TryAdd(id, DateTime.Now);
                    return(Task.CompletedTask);
                });
                return(process);
            });

            var processes = _fixture.CreateMany <IProcess>(processCount);
            var sut       = new SequentialProcess(processes);

            // act
            await sut.RunAsync(CancellationToken.None);

            // assert
            dict.Should().ContainKeys(expectedKeys);
        }
示例#2
0
        public void Should_route_to_pared_down_process()
        {
            var messageABC = new SequentialProcess
            {
                StepAInfo = "Foo",
                StepBInfo = "Bar",
                StepCInfo = "Baz",
            };

            var destinations = new[]
            {
                "NServiceBus.MessageRouting.RoutingSlips.Samples.StepA",
                "NServiceBus.MessageRouting.RoutingSlips.Samples.StepC",
                "NServiceBus.MessageRouting.RoutingSlips.Samples.ResultHost",
            };

            Console.WriteLine("Sending message...");

            var last = destinations.Last();

            var events = _fixture.SendAndWait(
                bus => bus.Route(messageABC, Guid.NewGuid(), destinations),
                c => c.Endpoint != last,
                TimeSpan.FromSeconds(60)).ToArray();

            events.Count().ShouldEqual(3);
        }
示例#3
0
        public void RunAsync_NoProcessesToRun_NoExceptions()
        {
            // arrange
            var sut = new SequentialProcess();

            // act + assert
            sut.Invoking(async process => await process.RunAsync(CancellationToken.None))
            .Should().NotThrow();
        }
示例#4
0
        public void Create_ListOfProcesses_ShouldContainSameProcesses()
        {
            // arrange
            var subProcesses = _fixture.CreateMany <IProcess>().ToArray();
            var sut          = new SequentialProcess();

            // act
            var process = sut.Create(subProcesses);

            // assert
            process.Should().BeEquivalentTo(subProcesses);
        }
示例#5
0
    static Task SendToAC(IEndpointInstance endpoint)
    {
        var sequentialProcess = new SequentialProcess
        {
            StepAInfo = "Foo",
            StepCInfo = "Baz",
        };

        log.Info("Sending message for step A, C");
        return(endpoint.Route(sequentialProcess, Guid.NewGuid(),
                              "Samples.RoutingSlips.StepA",
                              "Samples.RoutingSlips.StepC",
                              "Samples.RoutingSlips.ResultHost"));
    }
示例#6
0
        public void RunAsync_TaskThrows_Throws()
        {
            // arrange
            var expectedException = new Exception("I'm failing You, I'm so sorry.");
            var process           = A.Fake <IProcess>();

            A.CallTo(() => process.RunAsync(CancellationToken.None)).Returns(Task.FromException(expectedException));

            var sut = new SequentialProcess(new[] { process });

            // act + assert
            sut.Invoking(async x => await x.RunAsync(CancellationToken.None))
            .Should().Throw <Exception>().Where(ex => ex == expectedException);
        }
示例#7
0
    static Task SendToABC(IEndpointInstance endpoint)
    {
        #region multi-message-Send
        var sequentialProcess = new SequentialProcess
        {
            StepAInfo = "Foo",
            StepBInfo = "Bar",
            StepCInfo = "Baz",
        };
        #endregion

        log.Info("Sending message for step A, B, C");
        return(endpoint.Route(sequentialProcess, Guid.NewGuid(),
                              "Samples.RoutingSlips.StepA",
                              "Samples.RoutingSlips.StepB",
                              "Samples.RoutingSlips.StepC",
                              "Samples.RoutingSlips.ResultHost"));
    }
示例#8
0
        public void Run()
        {
            bool toggle = false;

            while (Console.ReadLine() != null)
            {
                if (toggle)
                {
                    var messageABC = new SequentialProcess
                    {
                        StepAInfo = "Foo",
                        StepBInfo = "Bar",
                        StepCInfo = "Baz",
                    };

                    Logger.Info("Sending message for step A, B, C");
                    Bus.Route(messageABC, Guid.NewGuid(), new[]
                    {
                        "NServiceBus.MessageRouting.RoutingSlips.Samples.StepA",
                        "NServiceBus.MessageRouting.RoutingSlips.Samples.StepB",
                        "NServiceBus.MessageRouting.RoutingSlips.Samples.StepC",
                        "NServiceBus.MessageRouting.RoutingSlips.Samples.ResultHost",
                    });
                }
                else
                {
                    var messageAC = new SequentialProcess
                    {
                        StepAInfo = "Foo",
                        StepCInfo = "Baz",
                    };

                    Logger.Info("Sending message for step A, C");
                    Bus.Route(messageAC, Guid.NewGuid(), new[]
                    {
                        "NServiceBus.MessageRouting.RoutingSlips.Samples.StepA",
                        "NServiceBus.MessageRouting.RoutingSlips.Samples.StepC",
                        "NServiceBus.MessageRouting.RoutingSlips.Samples.ResultHost",
                    });
                }

                toggle = !toggle;
            }
        }
示例#9
0
        public async Task RunAsync_ManyProcesses_RunInSequence(int processCount)
        {
            // arrange
            var processIdCounter              = 0;
            var runOrder                      = new BlockingCollection <int>(processCount);
            var parallelProcessCounter        = 0;
            var maxProcessesRunningInParallel = 0;
            var randomizer                    = new Random(Environment.TickCount);

            _fixture.Register(() =>
            {
                var process   = A.Fake <IProcess>();
                var processId = Interlocked.Increment(ref processIdCounter);

                A.CallTo(() => process.RunAsync(CancellationToken.None)).ReturnsLazily(async() =>
                {
                    var runningProcesses = Interlocked.Increment(ref parallelProcessCounter);

                    maxProcessesRunningInParallel = Math.Max(runningProcesses, maxProcessesRunningInParallel);
                    await Task.Delay(randomizer.Next(minValue: 1, maxValue: 100));

                    runOrder.Add(processId);
                    Interlocked.Decrement(ref parallelProcessCounter);
                });

                return(process);
            });

            var processes = _fixture.CreateMany <IProcess>(processCount);
            var sut       = new SequentialProcess(processes);

            // act
            await sut.RunAsync(CancellationToken.None);

            // assert
            maxProcessesRunningInParallel.Should().Be(1);
            runOrder.Should().HaveCount(processCount);
            runOrder.Should().BeInAscendingOrder();
        }
示例#10
0
        public void RunAsync_FirstTaskThrows_SecondTaksNewerInvoked()
        {
            // arrange
            var expectedException = new Exception("I'm failing You, I'm so sorry.");
            var firstProcess      = A.Fake <IProcess>();

            A.CallTo(() => firstProcess.RunAsync(CancellationToken.None)).Returns(Task.FromException(expectedException));

            var secondProcessWasInvoked = false;
            var secondProcess           = A.Fake <IProcess>();

            A.CallTo(() => secondProcess.RunAsync(CancellationToken.None)).Invokes(() => secondProcessWasInvoked = true);

            var sut = new SequentialProcess(new[] { firstProcess, secondProcess });

            // act
            sut.Invoking(async x => await x.RunAsync(CancellationToken.None))
            .Should().Throw <Exception>().Where(ex => ex == expectedException);

            // assert
            secondProcessWasInvoked.Should().BeFalse();
        }
示例#11
0
        static async Task RunBus()
        {
            IEndpointInstance endpoint = null;

            try
            {
                var configuration = new EndpointConfiguration("NServiceBus.MessageRouting.RoutingSlips.Samples.Sender");

                configuration.UseTransport <MsmqTransport>();
                configuration.UsePersistence <InMemoryPersistence>();
                configuration.EnableFeature <RoutingSlips>();
                configuration.SendFailedMessagesTo("error");

                endpoint = await Endpoint.Start(configuration);


                var toggle = false;

                while (Console.ReadLine() != null)
                {
                    if (toggle)
                    {
                        var messageABC = new SequentialProcess
                        {
                            StepAInfo = "Foo",
                            StepBInfo = "Bar",
                            StepCInfo = "Baz",
                        };

                        Logger.Info("Sending message for step A, B, C");
                        await endpoint.Route(messageABC, Guid.NewGuid(), new[]
                        {
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.StepA",
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.StepB",
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.StepC",
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.ResultHost",
                        });
                    }
                    else
                    {
                        var messageAC = new SequentialProcess
                        {
                            StepAInfo = "Foo",
                            StepCInfo = "Baz",
                        };

                        Logger.Info("Sending message for step A, C");
                        await endpoint.Route(messageAC, Guid.NewGuid(), new[]
                        {
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.StepA",
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.StepC",
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.ResultHost",
                        });
                    }

                    toggle = !toggle;
                }
            }
            finally
            {
                await endpoint.Stop();
            }
        }
        static async Task RunBus()
        {
            IEndpointInstance endpoint = null;
            try
            {
                var configuration = new EndpointConfiguration("NServiceBus.MessageRouting.RoutingSlips.Samples.Sender");

                configuration.UseTransport<MsmqTransport>();
                configuration.UsePersistence<InMemoryPersistence>();
                configuration.EnableFeature<RoutingSlips>();
                configuration.SendFailedMessagesTo("error");

                endpoint = await Endpoint.Start(configuration);


                var toggle = false;

                while (Console.ReadLine() != null)
                {
                    if (toggle)
                    {
                        var messageABC = new SequentialProcess
                        {
                            StepAInfo = "Foo",
                            StepBInfo = "Bar",
                            StepCInfo = "Baz",
                        };

                        Logger.Info("Sending message for step A, B, C");
                        await endpoint.Route(messageABC, Guid.NewGuid(), new[]
                        {
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.StepA",
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.StepB",
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.StepC",
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.ResultHost",
                        });
                    }
                    else
                    {
                        var messageAC = new SequentialProcess
                        {
                            StepAInfo = "Foo",
                            StepCInfo = "Baz",
                        };

                        Logger.Info("Sending message for step A, C");
                        await endpoint.Route(messageAC, Guid.NewGuid(), new[]
                        {
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.StepA",
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.StepC",
                            "NServiceBus.MessageRouting.RoutingSlips.Samples.ResultHost",
                        });
                    }

                    toggle = !toggle;
                }
            }
            finally
            {
                await endpoint.Stop();
            }
        }