示例#1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="T:ExitGames.Diagnostics.Counter.AverageCounter"/> class.
 /// </summary>
 /// <param name="name">The counter name.</param>
 public AverageCounter(string name)
     : base(name)
 {
     this.sharedCounter     = new SharedCounter(name);
     this.sharedCounterBase = new SharedCounter(name);
     this.oldSample         = this.GetNextSample();
 }
示例#2
0
        public async Task ItWorksWithCovarianceToo()
        {
            var counter = new SharedCounter(1);

            Using(counter);

            _activator.Handle <BaseMessage>(async baseMessage =>
            {
                throw new ApplicationException("1st level!!");
            });

            _activator.Handle <IFailed <BaseMessage> >(async failed =>
            {
                if (failed.Message is ConcreteMessage)
                {
                    counter.Decrement();
                    return;
                }

                counter.Fail("Did not receive the expected message!");
            });

            await _bus.SendLocal(new ConcreteMessage());

            counter.WaitForResetEvent();
        }
示例#3
0
        public async Task IncludesFullErrorDetailsWhenSecondLevelRetriesFailToo()
        {
            var counter = new SharedCounter(1);

            Using(counter);

            _activator.Handle <string>(async str =>
            {
                throw new ApplicationException("1st level!!");
            });

            _activator.Handle <IFailed <string> >(async failed =>
            {
                throw new ApplicationException("2nd level!!");
            });

            await _bus.SendLocal("hej med dig!");

            var transportMessage = await _network.WaitForNextMessageFrom("error");

            var errorDetails = transportMessage.Headers[Headers.ErrorDetails];

            Console.WriteLine(errorDetails);

            Assert.That(errorDetails, Does.Contain("1st level!!"));
            Assert.That(errorDetails, Does.Contain("2nd level!!"));
        }
示例#4
0
        public void CorrelationIdFlows()
        {
            var correlationIds = new List<string>();
            var counter = new SharedCounter(1);

            _activator1.Handle<string>(async (bus, ctx, str) =>
            {
                correlationIds.Add(ctx.Headers[Headers.CorrelationId]);
                await bus.Advanced.Routing.Send("bus2", "hej!");
            });
            _activator2.Handle<string>(async (bus, ctx, str) =>
            {
                correlationIds.Add(ctx.Headers[Headers.CorrelationId]);
                await bus.Advanced.Routing.Send("bus3", "hej!");
            });
            _activator3.Handle<string>(async (bus, ctx, str) =>
            {
                correlationIds.Add(ctx.Headers[Headers.CorrelationId]);
                counter.Decrement();
            });

            _activator1.Bus.SendLocal("heeeej!").Wait();

            counter.WaitForResetEvent();

            Assert.That(correlationIds.GroupBy(c => c).Count(), Is.EqualTo(1));
        }
示例#5
0
        public void CorrelationSequenceIsIncremented()
        {
            var correlationSequenceNumbers = new List<int>();
            var counter = new SharedCounter(1);

            _activator1.Handle<string>(async (bus, ctx, str) =>
            {
                correlationSequenceNumbers.Add(int.Parse(ctx.Headers[Headers.CorrelationSequence]));
                await bus.Advanced.Routing.Send("bus2", "hej!");
            });
            _activator2.Handle<string>(async (bus, ctx, str) =>
            {
                correlationSequenceNumbers.Add(int.Parse(ctx.Headers[Headers.CorrelationSequence]));
                await bus.Advanced.Routing.Send("bus3", "hej!");
            });
            _activator3.Handle<string>(async (bus, ctx, str) =>
            {
                correlationSequenceNumbers.Add(int.Parse(ctx.Headers[Headers.CorrelationSequence]));
                counter.Decrement();
            });

            _activator1.Bus.SendLocal("heeeej!").Wait();

            counter.WaitForResetEvent();

            Assert.That(correlationSequenceNumbers, Is.EqualTo(new[] { 0, 1, 2 }));
        }
示例#6
0
        public async Task ItWorks()
        {
            var counter = new SharedCounter(1);

            Using(counter);

            _activator.Handle <string>(async str =>
            {
                throw new ApplicationException("1st level!!");
            });

            _activator.Handle <IFailed <string> >(async failed =>
            {
                if (failed.Message != "hej med dig!")
                {
                    counter.Fail("Did not receive the expected message!");
                    return;
                }

                counter.Decrement();
            });

            await _bus.SendLocal("hej med dig!");

            counter.WaitForResetEvent();
        }
示例#7
0
    static void RunTheTest(IRebusLoggerFactory logger)
    {
        using var sharedCounter = new SharedCounter(3, "Message counter")
              {
                  Delay = TimeSpan.FromSeconds(2)
              };
        using var activator = new BuiltinHandlerActivator();

        activator.Register(() => new SomeSaga(sharedCounter));

        var bus = Configure.With(activator)
                  .Logging(l => l.Use(logger))
                  .Transport(t => t.UseInMemoryTransport(new InMemNetwork(), "saga_snapshots_integration_testerino"))
                  .Sagas(s => s.StoreInMemory())
                  .Options(o => o.EnableSagaAuditing().OutputToLog())
                  .Start();

        Task.WaitAll(
            bus.SendLocal("hej/med dig"),
            bus.SendLocal("hej/igen"),
            bus.SendLocal("hej/igen med dig")
            );

        sharedCounter.WaitForResetEvent(timeoutSeconds: 10);
    }
        public async Task EverythingHappensInSerialOrder(int numberOfMessages)
        {
            var bus     = _activator.Bus;
            var counter = new SharedCounter(numberOfMessages);

            _activator.Handle <string>(async str =>
            {
                await Task.Yield();
                _eventRecorder.Enqueue($"Handling {str}");
                counter.Decrement();
            });

            foreach (var number in Enumerable.Range(1, numberOfMessages))
            {
                await bus.SendLocal($"{number}", new Dictionary <string, string> {
                    { "number", number.ToString(CultureInfo.InvariantCulture) }
                });
            }

            counter.WaitForResetEvent(5 + numberOfMessages / 10);

            // allow for handler pipeline to finish processing the last message
            await Task.Delay(500);

            // now check that no events were interleaved at any point in time
            foreach (var batch in _eventRecorder.Batch(4))
            {
                VerifyBatch(batch);
            }
        }
示例#9
0
        public void CorrelationIdIsFirstMessageId()
        {
            var messageIds     = new List <string>();
            var correlationIds = new List <string>();
            var counter        = new SharedCounter(1);

            _activator1.Handle <string>(async(bus, ctx, str) =>
            {
                messageIds.Add(ctx.Headers[Headers.MessageId]);
                correlationIds.Add(ctx.Headers[Headers.CorrelationId]);
                await bus.Advanced.Routing.Send("bus2", "hej!");
            });
            _activator2.Handle <string>(async(bus, ctx, str) =>
            {
                messageIds.Add(ctx.Headers[Headers.MessageId]);
                correlationIds.Add(ctx.Headers[Headers.CorrelationId]);
                counter.Decrement();
            });

            _activator1.Bus.SendLocal("heeeej!").Wait();

            counter.WaitForResetEvent();

            var firstMessageId = messageIds.First();

            Assert.That(correlationIds.All(c => c == firstMessageId), Is.True);
        }
示例#10
0
            void InitOnEntry()
            {
                var flag = (this.ReceivedEvent as Config).Flag;

                var counter = SharedCounter.Create(this.Id.Runtime, 0);
                var n       = this.CreateMachine(typeof(N2), new E(counter));

                int v1 = counter.CompareExchange(10, 0); // if 0 then 10
                int v2 = counter.GetValue();

                if (flag == 0)
                {
                    this.Assert((v1 == 5 && v2 == 5) ||
                                (v1 == 0 && v2 == 10) ||
                                (v1 == 0 && v2 == 15));
                }
                else if (flag == 1)
                {
                    this.Assert((v1 == 0 && v2 == 10) ||
                                (v1 == 0 && v2 == 15));
                }
                else if (flag == 2)
                {
                    this.Assert((v1 == 5 && v2 == 5) ||
                                (v1 == 0 && v2 == 15));
                }
                else if (flag == 3)
                {
                    this.Assert((v1 == 5 && v2 == 5) ||
                                (v1 == 0 && v2 == 10));
                }
            }
示例#11
0
            private void InitOnEntry(Event e)
            {
                var flag = (e as SetupEvent).Flag;

                var counter = SharedCounter.Create(this.Id.Runtime, 0);

                this.CreateActor(typeof(N2), new E(counter));

                int v1 = counter.CompareExchange(10, 0); // if 0 then 10
                int v2 = counter.GetValue();

                if (flag is 0)
                {
                    this.Assert((v1 == 5 && v2 == 5) || (v1 is 0 && v2 == 10) ||
                                (v1 is 0 && v2 == 15));
                }
                else if (flag is 1)
                {
                    this.Assert((v1 is 0 && v2 == 10) || (v1 is 0 && v2 == 15),
                                "Reached test assertion.");
                }
                else if (flag is 2)
                {
                    this.Assert((v1 == 5 && v2 == 5) || (v1 is 0 && v2 == 15),
                                "Reached test assertion.");
                }
                else if (flag is 3)
                {
                    this.Assert((v1 == 5 && v2 == 5) || (v1 is 0 && v2 == 10),
                                "Reached test assertion.");
                }
            }
示例#12
0
        public void CorrelationSequenceIsIncremented()
        {
            var correlationSequenceNumbers = new List <int>();
            var counter = new SharedCounter(1);

            _activator1.Handle <string>(async(bus, ctx, str) =>
            {
                correlationSequenceNumbers.Add(int.Parse(ctx.Headers[Headers.CorrelationSequence]));
                await bus.Advanced.Routing.Send("bus2", "hej!");
            });
            _activator2.Handle <string>(async(bus, ctx, str) =>
            {
                correlationSequenceNumbers.Add(int.Parse(ctx.Headers[Headers.CorrelationSequence]));
                await bus.Advanced.Routing.Send("bus3", "hej!");
            });
            _activator3.Handle <string>(async(bus, ctx, str) =>
            {
                correlationSequenceNumbers.Add(int.Parse(ctx.Headers[Headers.CorrelationSequence]));
                counter.Decrement();
            });

            _activator1.Bus.SendLocal("heeeej!").Wait();

            counter.WaitForResetEvent();

            Assert.That(correlationSequenceNumbers, Is.EqualTo(new[] { 0, 1, 2 }));
        }
        public async Task ItWorks()
        {
            var counter = new SharedCounter(20);

            var activator = new BuiltinHandlerActivator();

            Using(activator);

            activator.Register(() => new SimpleSaga1(counter));
            activator.Register(() => new SimpleSaga2(counter));

            var network = new InMemNetwork();

            var bus = Configure.With(activator)
                      .Transport(t => t.UseInMemoryTransport(network, "enforce exclusive access buggg repro"))
                      .Options(o => { o.SetNumberOfWorkers(2); })
                      .Sagas(s =>
            {
                s.StoreInMemory();
                s.EnforceExclusiveAccess();
            })
                      .Routing(r => r.TypeBased().Map <StartSaga>("enforce exclusive access buggg repro"))
                      .Timeouts(t => t.StoreInMemory())
                      .Start();

            for (int i = 0; i < 10; i++)
            {
                var id = Guid.NewGuid();
                Console.WriteLine($"Sending message with id {id}");
                await bus.Send(new StartSaga { SessionId = id });
            }

            counter.WaitForResetEvent();
        }
示例#14
0
        public void SentMessageCarriesTheTypeHeader()
        {
            var activator = Using(new BuiltinHandlerActivator());

            var receivedHeaders = new Dictionary <string, string>();
            var counter         = new SharedCounter(1);

            activator.Handle <SomeMessage>(async(bus, context, message) =>
            {
                foreach (var kvp in context.Headers)
                {
                    receivedHeaders.Add(kvp.Key, kvp.Value);
                }
                counter.Decrement();
            });

            Configure.With(activator)
            .Transport(t => t.UseInMemoryTransport(new InMemNetwork(), "type-header-test"))
            .Options(o => o.LogPipeline())
            .Start();

            activator.Bus.SendLocal(new SomeMessage()).Wait();

            counter.WaitForResetEvent();

            Assert.That(receivedHeaders.ContainsKey(Headers.Type), Is.True);
            Assert.That(receivedHeaders[Headers.Type], Is.EqualTo("Rebus.Tests.Integration.SomeMessage, Rebus.Tests"));
        }
示例#15
0
    public void CreatesSnapshotOfSagaData()
    {
        var sharedCounter = new SharedCounter(3, "Message counter")
        {
            Delay = TimeSpan.FromSeconds(2)
        };

        Using(sharedCounter);

        _activator.Register(() => new SomeSaga(sharedCounter, false));
        _starter.Start();

        Task.WaitAll(
            _bus.SendLocal("hej/med dig"),
            _bus.SendLocal("hej/igen"),
            _bus.SendLocal("hej/igen med dig")
            );

        sharedCounter.WaitForResetEvent(timeoutSeconds: 10);

        var allSnapshots = _factory.GetAllSnapshots().ToList();

        Assert.That(allSnapshots.Count, Is.EqualTo(3));

        Assert.That(allSnapshots.All(s => s.SagaData.Id == allSnapshots.First().SagaData.Id),
                    "Not all snapshots had the same saga ID!");

        Assert.That(allSnapshots.OrderBy(s => s.SagaData.Revision).Select(s => s.SagaData.Revision), Is.EqualTo(new[] { 0, 1, 2 }),
                    "Expected the three initial revisions");
    }
示例#16
0
        public void CorrelationIdFlows()
        {
            var correlationIds = new List <string>();
            var counter        = new SharedCounter(1);

            _activator1.Handle <string>(async(bus, ctx, str) =>
            {
                correlationIds.Add(ctx.Headers[Headers.CorrelationId]);
                await bus.Advanced.Routing.Send("bus2", "hej!");
            });
            _activator2.Handle <string>(async(bus, ctx, str) =>
            {
                correlationIds.Add(ctx.Headers[Headers.CorrelationId]);
                await bus.Advanced.Routing.Send("bus3", "hej!");
            });
            _activator3.Handle <string>(async(bus, ctx, str) =>
            {
                correlationIds.Add(ctx.Headers[Headers.CorrelationId]);
                counter.Decrement();
            });

            _activator1.Bus.SendLocal("heeeej!").Wait();

            counter.WaitForResetEvent();

            Assert.That(correlationIds.GroupBy(c => c).Count(), Is.EqualTo(1));
        }
        public async Task WorksAsExpected()
        {
            const int count = 5;

            var props         = new ConcurrentQueue <SagaProps>();
            var sharedCounter = new SharedCounter(count);

            _activator.Register(() => new MyExclusiveSaga(props, sharedCounter));

            _busStarter.Start();

            var bus = _activator.Bus;

            count.Times(() => bus.Advanced.SyncBus.SendLocal(new Go("corr1")));

            sharedCounter.WaitForResetEvent();

            // see if we get any extra props
            await Task.Delay(TimeSpan.FromSeconds(1));

            var recordedProps = props.ToList();

            Assert.That(recordedProps.Count, Is.EqualTo(count));

            Assert.That(recordedProps.First().IsNew, Is.True);
            Assert.That(recordedProps.Skip(1).All(p => p.IsNew), Is.False);
        }
示例#18
0
        public async Task ItWorksWithCovarianceToo()
        {
            var counter = new SharedCounter(1);

            Using(counter);

            _activator.Handle<BaseMessage>(async baseMessage =>
            {
                throw new ApplicationException("1st level!!");
            });

            _activator.Handle<IFailed<BaseMessage>>(async failed =>
            {
                if (failed.Message is ConcreteMessage)
                {
                    counter.Decrement();
                    return;
                }

                counter.Fail("Did not receive the expected message!");
            });

            await _bus.SendLocal(new ConcreteMessage());

            counter.WaitForResetEvent();
        }
        public async Task NizzleName(int messageCount, bool useNewIndexScript, bool dropOldIndex)
        {
            if (useNewIndexScript)
            {
                SqlTestHelper.Execute(IndexCreationScriptToCheck);

                SqlTestHelper.DropIndex(TableName, $"IDX_RECEIVE_{TableName}");
            }

            Console.WriteLine($"Sending {messageCount} messages...");

            await Task.WhenAll(Enumerable.Range(0, messageCount)
                               .Select(i => _adapter.Bus.SendLocal($"THIS IS MESSAGE {i}")));

            var counter = new SharedCounter(messageCount);

            _adapter.Handle <string>(async message => counter.Decrement());

            Console.WriteLine("Waiting for messages to be received...");

            var stopwtach = Stopwatch.StartNew();

            _adapter.Bus.Advanced.Workers.SetNumberOfWorkers(3);

            counter.WaitForResetEvent(messageCount / 500 + 5);

            var elapsedSeconds = stopwtach.Elapsed.TotalSeconds;

            Console.WriteLine($"{messageCount} messages received in {elapsedSeconds:0.0} s - that's {messageCount / elapsedSeconds:0.0} msg/s");
        }
    public async Task IntegrationTest()
    {
        using var counter = new SharedCounter(initialValue: 3);

        var typeNames = new ConcurrentDictionary <Type, string>();

        using var activator = new BuiltinHandlerActivator();

        activator.Handle <object>(async(_, context, message) =>
        {
            typeNames[message.GetType()] = context.Headers.GetValue(Headers.Type);
            counter.Decrement();
        });

        Configure.With(activator)
        .Transport(t => t.UseInMemoryTransport(new InMemNetwork(), "whatever"))
        .Serialization(s => s.UseCustomMessageTypeNames()
                       .AddWithCustomName <FirstMessage>("FourthMessage") //< confuse the enemy!
                       .AddWithShortName <SecondMessage>()
                       .AllowFallbackToDefaultConvention())
        .Start();

        await activator.Bus.SendLocal(new FirstMessage());

        await activator.Bus.SendLocal(new SecondMessage());

        await activator.Bus.SendLocal(new ThirdMessage());

        counter.WaitForResetEvent();

        Assert.That(typeNames[typeof(FirstMessage)], Is.EqualTo("FourthMessage"));
        Assert.That(typeNames[typeof(SecondMessage)], Is.EqualTo("SecondMessage"));
        Assert.That(typeNames[typeof(ThirdMessage)], Is.EqualTo(typeof(ThirdMessage).GetSimpleAssemblyQualifiedName()));
    }
        public void CanDeferTransportMessage()
        {
            var counter = new SharedCounter(1);

            Using(counter);

            var customHeaders = new Dictionary<string, string>
            {
                {"testheader", "customizzle valuizzle"}
            };

            var didDeferTheMessage = false;

            _forwarderActivator.Handle<string>(async (bus, str) =>
            {
                if (!didDeferTheMessage)
                {
                    Console.WriteLine("Got the message for the first time - deferring it!");

                    await bus.Advanced.TransportMessage.Defer(TimeSpan.FromSeconds(2), customHeaders);

                    didDeferTheMessage = true;

                    return;
                }

                Console.WriteLine("Got the message after it was deferred... nice!");

                counter.Decrement();
            });

            _forwarderActivator.Bus.SendLocal("hej med dig min ven!!!").Wait();

            counter.WaitForResetEvent();
        }
        public void CanForwardMessageToErrorQueue()
        {
            var sharedCounter = new SharedCounter(1) { Delay = TimeSpan.FromSeconds(0.1) };

            Using(sharedCounter);

            _forwarderActivator.Handle<string>(async (bus, str) =>
            {
                await bus.Advanced.TransportMessage.Forward(ForwardedMessagesQueue, new Dictionary<string, string> {{"testheader", "OK"}});
            });

            _receiverActivator.Handle<string>(async (bus, context, str) =>
            {
                var headers = context.TransportMessage.Headers;

                if (!headers.ContainsKey("testheader"))
                {
                    sharedCounter.Fail("Could not find 'testheader' header!");
                    return;
                }

                var headerValue = headers["testheader"];
                if (headerValue != "OK")
                {
                    sharedCounter.Fail("'testheader' header had value {0}", headerValue);
                    return;
                }

                sharedCounter.Decrement();
            });

            _forwarderActivator.Bus.SendLocal("hej med dig min ven!!!").Wait();

            sharedCounter.WaitForResetEvent();
        }
        public async Task CheckTimes()
        {
            var counter = new SharedCounter(2);

            _activator.Register(() => new LongStringSaga(counter));
            _starter.Start();

            var longString = string.Join("/", Enumerable.Repeat("long string", 100000));

            Console.WriteLine($"Sending string with {longString.Length} characters...");

            await _activator.Bus.SendLocal($"secret-id/{longString}");

            Console.WriteLine("Sending short string...");

            var stopwatch = Stopwatch.StartNew();

            await _activator.Bus.SendLocal("secret-id/hej med dig min ven!");

            counter.WaitForResetEvent(timeoutSeconds: 10);

            var elapsed = stopwatch.Elapsed;

            Console.WriteLine($"Elapsed s: {elapsed.TotalSeconds:0.0}");
        }
        public static async Task WhenAll()
        {
            var counter = new SharedCounter();
            var source1 = new ValueTaskCompletionSource();
            var source2 = new ValueTaskCompletionSource();
            var source3 = new ValueTaskCompletionSource();

            ThreadPool.QueueUserWorkItem(state =>
            {
                counter.Inc();
                Thread.Sleep(100);
                source1.Complete();
            });
            ThreadPool.QueueUserWorkItem(state =>
            {
                counter.Inc();
                Thread.Sleep(200);
                source2.Complete();
            });
            ThreadPool.QueueUserWorkItem(state =>
            {
                counter.Inc();
                Thread.Sleep(150);
                source3.Complete();
            });
            await ValueTaskSynchronization.WhenAll(source1.Task, source2.Task, source3.Task);

            Equal(3, counter.Value);
        }
        public async Task ItWorks()
        {
            var activator        = Using(new BuiltinHandlerActivator());
            var messagesBySagaId = new ConcurrentDictionary <Guid, int>();
            var counter          = new SharedCounter(5);

            activator.Register(() => new MySaga(messagesBySagaId, counter));

            Configure.With(activator)
            .Transport(t => t.UseInMemoryTransport(new InMemNetwork(), "saga-property-nesting"))
            .Sagas(s => s.StoreInMemory())
            .Start();

            await activator.Bus.SendLocal(new MyMsg("hej1"));

            await activator.Bus.SendLocal(new MyMsg("hej1"));

            await activator.Bus.SendLocal(new MyMsg("hej2"));

            await activator.Bus.SendLocal(new MyMsg("hej2"));

            await activator.Bus.SendLocal(new MyMsg("hej2"));

            counter.WaitForResetEvent();

            Console.WriteLine(string.Join(Environment.NewLine, messagesBySagaId));

            Assert.That(messagesBySagaId.Count, Is.EqualTo(2));
            Assert.That(messagesBySagaId.Count(kvp => kvp.Value == 2), Is.EqualTo(1));
            Assert.That(messagesBySagaId.Count(kvp => kvp.Value == 3), Is.EqualTo(1));
        }
示例#26
0
        public async Task ItWorks()
        {
            var counter = new SharedCounter(1);

            Using(counter);

            _activator.Handle<string>(async str =>
            {
                throw new ApplicationException("1st level!!");
            });

            _activator.Handle<Failed<string>>(async failed =>
            {
                if (failed.Message != "hej med dig!")
                {
                    counter.Fail("Did not receive the expected message!");
                    return;
                }

                counter.Decrement();
            });

            await _bus.SendLocal("hej med dig!");

            counter.WaitForResetEvent();
        }
        public void CanDeferTransportMessage()
        {
            var counter = new SharedCounter(1);

            Using(counter);

            var customHeaders = new Dictionary <string, string>
            {
                { "testheader", "customizzle valuizzle" }
            };

            var didDeferTheMessage = false;

            _forwarderActivator.AddHandlerWithBusTemporarilyStopped <string>(async(bus, str) =>
            {
                if (!didDeferTheMessage)
                {
                    Console.WriteLine("Got the message for the first time - deferring it!");

                    await bus.Advanced.TransportMessage.Defer(TimeSpan.FromSeconds(2), customHeaders);

                    didDeferTheMessage = true;

                    return;
                }

                Console.WriteLine("Got the message after it was deferred... nice!");

                counter.Decrement();
            });

            _forwarderActivator.Bus.SendLocal("hej med dig min ven!!!").Wait();

            counter.WaitForResetEvent();
        }
示例#28
0
        public async Task CanCorrelateWithHeadersOfIncomingMessagesByUsingContext()
        {
            var sagaDataCounters = new ConcurrentDictionary <Guid, int>();
            var sharedCounter    = new SharedCounter(5);

            _activator.Register(() => new MySaga(sharedCounter, sagaDataCounters, true));

            _busStarter.Start();

            var bus = _activator.Bus;

            var sameMessage = new MyMessage();
            var headers1    = new Dictionary <string, string> {
                { "custom-correlation-id", "saga1" }
            };
            var headers2 = new Dictionary <string, string> {
                { "custom-correlation-id", "saga2" }
            };

            await bus.SendLocal(sameMessage, headers1);

            await bus.SendLocal(sameMessage, headers2);

            await bus.SendLocal(sameMessage, headers2);

            await bus.SendLocal(sameMessage, headers1);

            await bus.SendLocal(sameMessage, headers1);

            sharedCounter.WaitForResetEvent(timeoutSeconds: 2);
        }
示例#29
0
    public void CreatesSnapshotOfSagaDataAlsoWhenImmediatelyMarkingAsComplete()
    {
        var sharedCounter = new SharedCounter(3, "Message counter")
        {
            Delay = TimeSpan.FromSeconds(1)
        };

        Using(sharedCounter);

        _activator.Register(() => new SomeSaga(sharedCounter, true));
        _starter.Start();

        Task.WaitAll(
            _bus.SendLocal("hej/med dig"),
            _bus.SendLocal("hej/igen"),
            _bus.SendLocal("hej/igen med dig")
            );

        sharedCounter.WaitForResetEvent();

        Thread.Sleep(500); //< be sure that the snapshot has made it to the database

        var allSnapshots = _factory.GetAllSnapshots().ToList();

        Assert.That(allSnapshots.Count, Is.EqualTo(3));

        Assert.That(allSnapshots.All(s => s.SagaData.Revision == 0), "Not all revisions were initial!: {0}", allSnapshots.Select(s => s.SagaData.Revision));

        Assert.That(allSnapshots.Select(s => s.SagaData.Id).Distinct().Count(), Is.EqualTo(3), "Expected three different saga IDs!");
    }
示例#30
0
        public async Task CanInitiateSagaAndOverrideItsId()
        {
            var counter = new SharedCounter(5);

            _activator.Register(() => new DefaultSaga(counter));

            _busStarter.Start();

            var id1 = Guid.NewGuid();
            var id2 = Guid.NewGuid();

            // five messages using 2 ids
            await _activator.Bus.SendLocal(new DefaultSagaMessage(id1));

            await _activator.Bus.SendLocal(new DefaultSagaMessage(id2));

            await _activator.Bus.SendLocal(new DefaultSagaMessage(id1));

            await _activator.Bus.SendLocal(new DefaultSagaMessage(id2));

            await _activator.Bus.SendLocal(new DefaultSagaMessage(id1));

            counter.WaitForResetEvent();

            var sagaInstances = _sagas.Instances.ToList();

            Assert.That(sagaInstances.Count, Is.EqualTo(2));
        }
示例#31
0
        public void SentMessageCarriesTheTypeHeader()
        {
            var activator = Using(new BuiltinHandlerActivator());

            var receivedHeaders = new Dictionary<string, string>();
            var counter = new SharedCounter(1);

            activator.Handle<SomeMessage>(async (bus, context, message) =>
            {
                foreach (var kvp in context.Headers)
                {
                    receivedHeaders.Add(kvp.Key, kvp.Value);
                }
                counter.Decrement();
            });

            Configure.With(activator)
                .Transport(t => t.UseInMemoryTransport(new InMemNetwork(), "type-header-test"))
                .Options(o => o.LogPipeline())
                .Start();

            activator.Bus.SendLocal(new SomeMessage()).Wait();

            counter.WaitForResetEvent();

            Assert.That(receivedHeaders.ContainsKey(Headers.Type), Is.True);
            Assert.That(receivedHeaders[Headers.Type], Is.EqualTo("Rebus.Tests.Integration.SomeMessage, Rebus.Tests"));
        }
示例#32
0
        public void WorksWithPrefetch(int prefetch, int numberOfMessages, int maxParallelism)
        {
            var activator = Using(new BuiltinHandlerActivator());
            var counter   = new SharedCounter(numberOfMessages);

            Using(counter);

            activator.Handle <string>(async str =>
            {
                counter.Decrement();
            });

            Console.WriteLine("Sending {0} messages", numberOfMessages);

            var transport = GetTransport();
            var tasks     = Enumerable.Range(0, numberOfMessages)
                            .Select(i => $"THIS IS MESSAGE # {i}")
                            .Select(async msg =>
            {
                using (var scope = new RebusTransactionScope())
                {
                    var headers          = DefaultHeaders();
                    var body             = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(msg));
                    var transportMessage = new TransportMessage(headers, body);

                    await transport.Send(_queueName, transportMessage, scope.TransactionContext);

                    await scope.CompleteAsync();
                }
            })
                            .ToArray();

            Task.WhenAll(tasks).Wait();

            Console.WriteLine("Receiving {0} messages", numberOfMessages);

            var stopwatch = Stopwatch.StartNew();

            Configure.With(activator)
            .Logging(l => l.Console(LogLevel.Info))
            .Transport(t =>
            {
                t.UseAzureServiceBus(AsbTestConfig.ConnectionString, _queueName)
                .EnablePrefetching(prefetch);
            })
            .Options(o =>
            {
                o.SetNumberOfWorkers(1);
                o.SetMaxParallelism(maxParallelism);
            })
            .Start();

            counter.WaitForResetEvent(timeoutSeconds: (int)(numberOfMessages * 0.1 + 3));

            var elapsedSeconds = stopwatch.Elapsed.TotalSeconds;

            Console.WriteLine("Receiving {0} messages took {1:0.0} s - that's {2:0.0} msg/s",
                              numberOfMessages, elapsedSeconds, numberOfMessages / elapsedSeconds);
        }
示例#33
0
        public void IncludesCorrelationIdInTheThreeLoggedLines()
        {
            // ${basedir}/logs/logfile.log

#if NETSTANDARD1_3
            var logFilePath = Path.Combine(AppContext.BaseDirectory, "logs", "logfile.log");
#else
            var logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs", "logfile.log");
#endif
            if (File.Exists(logFilePath))
            {
                File.Delete(logFilePath);
            }

            var activator = new BuiltinHandlerActivator();

            Configure.With(Using(activator))
            .Logging(l => l.NLog())
            .Transport(t => t.UseInMemoryTransport(new InMemNetwork(), "test"))
            .Start();

            var counter = new SharedCounter(1);

            Using(counter);

            var logger = LogManager.GetLogger("test");

            activator.Handle <string>(async str =>
            {
                logger.Info("1");

                await Task.Delay(100);

                logger.Info("2");

                await Task.Delay(100);

                logger.Info("3");

                counter.Decrement();
            });

            var headers = new Dictionary <string, string>
            {
                { Headers.CorrelationId, "known-correlation-id" }
            };

            activator.Bus.SendLocal("hej med dig min ven!!!", headers).Wait();

            counter.WaitForResetEvent();

            WaitForFile(logFilePath);

            var loggedLines = File.ReadAllLines(logFilePath);

            AssertLineIsThere(loggedLines, "1|known-correlation-id");
            AssertLineIsThere(loggedLines, "2|known-correlation-id");
            AssertLineIsThere(loggedLines, "3|known-correlation-id");
        }
        public void CanCorrelateWithIncomingMessageWhichIsInherited()
        {
            var counter = new SharedCounter(1);

            _activator.Register((bus, context) => new PolySaga(counter));

            _activator.Bus.SendLocal(new ConcreteInitiatingMessage()).Wait();

            counter.WaitForResetEvent(timeoutSeconds: 2);
        }
示例#35
0
            private void InitOnEntry()
            {
                var counter = SharedCounter.Create(this.Id.Runtime, 0);

                this.CreateActor(typeof(N1), new E(counter));

                counter.Increment();
                var v = counter.GetValue();

                this.Assert(v is 1, "Reached test assertion.");
            }
            void EntryInit()
            {
                var counter = SharedCounter.Create(this.Id.Runtime, 0);

                this.CreateMachine(typeof(N), new E(counter));

                counter.Increment();
                var v = counter.GetValue();

                this.Assert(v == 1);
            }
示例#37
0
            private void InitOnEntry(Event e)
            {
                this.Counter = (e as E).Counter;
                this.Counter.Add(-4);
                this.Counter.Decrement();

                var v = this.Counter.Exchange(100);

                this.Counter.Add(-5);
                this.Counter.Add(v - 100);
            }
示例#38
0
        public void DoesNotLogWarningsUnderNormalUse()
        {
            var counter = new SharedCounter(3);
            _activator.Handle<string>(async str => counter.Decrement());

            _activator.Bus.SendLocal("hej").Wait();
            _activator.Bus.SendLocal("med").Wait();
            _activator.Bus.SendLocal("dig").Wait();

            counter.WaitForResetEvent();

            CleanUpDisposables();

            var logLinesWarnLevelOrAbove = _logs.Where(l => l.Level >= LogLevel.Warn).ToList();

            Assert.That(logLinesWarnLevelOrAbove.Any(), Is.False, $@"Got the following log lines >= WARN:

{string.Join(Environment.NewLine, logLinesWarnLevelOrAbove)}");
        }
示例#39
0
        public async Task FailedMessageAllowsForAccessingHeaders()
        {
            var counter = new SharedCounter(1);

            _activator.Handle<string>(async str =>
            {
                throw new ApplicationException("1st level!!");
            });

            var headersOfFailedMessage = new Dictionary<string,string>();

            _activator.Handle<Failed<string>>(async failed =>
            {
                if (failed.Message != "hej med dig!")
                {
                    counter.Fail("Did not receive the expected message!");
                    return;
                }

                foreach (var kvp in failed.Headers)
                {
                    headersOfFailedMessage.Add(kvp.Key, kvp.Value);
                }

                Console.WriteLine();
                Console.WriteLine("----------------------------------------------------------------------------------------------------");
                Console.WriteLine(failed.ErrorDescription);
                Console.WriteLine("----------------------------------------------------------------------------------------------------");
                Console.WriteLine();

                counter.Decrement();
            });

            var headers = new Dictionary<string, string>
            {
                {"custom-header", "with-a-custom-value" }
            };

            await _bus.SendLocal("hej med dig!", headers);

            counter.WaitForResetEvent();

            Console.WriteLine(string.Join(Environment.NewLine , headersOfFailedMessage.Select(kvp => string.Format("    {0}: {1}", kvp.Key, kvp.Value))));

            Assert.That(headersOfFailedMessage["custom-header"], Is.EqualTo("with-a-custom-value"));
        }
示例#40
0
        public void MessageIdsAreDifferent()
        {
            var messageIds = new List<string>();
            var counter = new SharedCounter(1);

            _activator1.Handle<string>(async (bus, ctx, str) =>
            {
                messageIds.Add(ctx.Headers[Headers.MessageId]);
                await bus.Advanced.Routing.Send("bus2", "hej!");
            });
            _activator2.Handle<string>(async (bus, ctx, str) =>
            {
                messageIds.Add(ctx.Headers[Headers.MessageId]);
                counter.Decrement();
            });

            _activator1.Bus.SendLocal("heeeej!").Wait();

            counter.WaitForResetEvent();

            Assert.That(messageIds.GroupBy(i => i).Count(), Is.EqualTo(2));
        }
示例#41
0
        public void CorrelationIdIsFirstMessageId()
        {
            var messageIds = new List<string>();
            var correlationIds = new List<string>();
            var counter = new SharedCounter(1);

            _activator1.Handle<string>(async (bus, ctx, str) =>
            {
                messageIds.Add(ctx.Headers[Headers.MessageId]);
                correlationIds.Add(ctx.Headers[Headers.CorrelationId]);
                await bus.Advanced.Routing.Send("bus2", "hej!");
            });
            _activator2.Handle<string>(async (bus, ctx, str) =>
            {
                messageIds.Add(ctx.Headers[Headers.MessageId]);
                correlationIds.Add(ctx.Headers[Headers.CorrelationId]);
                counter.Decrement();
            });

            _activator1.Bus.SendLocal("heeeej!").Wait();

            counter.WaitForResetEvent();

            var firstMessageId = messageIds.First();
            Assert.That(correlationIds.All(c => c == firstMessageId), Is.True);
        }
        async Task RunDeferTest()
        {
            var replyCounter = new SharedCounter(1);

            _client.Handle<string>(async reply =>
            {
                Console.WriteLine($"CLIENT got reply '{reply}'  (elapsed: {_stopwatch.Elapsed.TotalSeconds:0.# s})");
                replyCounter.Decrement();
            });

            await _client.Bus.Send("request");

            replyCounter.WaitForResetEvent();
        }