示例#1
0
        public void BasicReqResp()
        {
            // arrange

            // ensure the topic has 2 partitions
            var topic = $"test-echo";
            var echoRequestHandler = new EchoRequestHandler();

            MessageBusBuilder
            .Publish <EchoRequest>(x =>
            {
                x.DefaultTopic(topic);
            })
            .Handle <EchoRequest, EchoResponse>(x => x.Topic(topic)
                                                .Group("handler")          // ensure consumer group exists on the event hub
                                                .WithHandler <EchoRequestHandler>()
                                                .Instances(2))
            .ExpectRequestResponses(x =>
            {
                x.ReplyToTopic("test-echo-resp");
                x.Group("response-reader");     // ensure consumer group exists on the event hub
                x.DefaultTimeout(TimeSpan.FromSeconds(30));
            })
            .WithDependencyResolver(new LookupDependencyResolver(f =>
            {
                if (f == typeof(EchoRequestHandler))
                {
                    return(echoRequestHandler);
                }
                throw new InvalidOperationException();
            }));

            var kafkaMessageBus = MessageBus.Value;

            // act

            var requests = Enumerable
                           .Range(0, NumberOfMessages)
                           .Select(i => new EchoRequest {
                Index = i, Message = $"Echo {i}"
            })
                           .ToList();

            var responses = new List <Tuple <EchoRequest, EchoResponse> >();

            requests.AsParallel().ForAll(req =>
            {
                var resp = kafkaMessageBus.Send(req).Result;
                lock (responses)
                {
                    responses.Add(Tuple.Create(req, resp));
                }
            });

            // assert

            // all messages got back
            responses.Count.Should().Be(NumberOfMessages);
            responses.All(x => x.Item1.Message == x.Item2.Message).Should().BeTrue();
        }
示例#2
0
        public void BasicPubSub()
        {
            // arrange

            var topic = $"test-ping";

            var pingConsumer = new PingConsumer();

            MessageBusBuilder
            .Publish <PingMessage>(x =>
            {
                x.DefaultTopic(topic);
            })
            .SubscribeTo <PingMessage>(x => x.Topic(topic)
                                       .Group("subscriber")          // ensure consumer group exists on the event hub
                                       .WithSubscriber <PingConsumer>()
                                       .Instances(2))
            .WithDependencyResolver(new LookupDependencyResolver(f =>
            {
                if (f == typeof(PingConsumer))
                {
                    return(pingConsumer);
                }
                throw new InvalidOperationException();
            }));

            var kafkaMessageBus = MessageBus.Value;

            // act

            // publish
            var stopwatch = Stopwatch.StartNew();

            var messages = Enumerable
                           .Range(0, NumberOfMessages)
                           .Select(i => new PingMessage {
                Counter = i, Timestamp = DateTime.UtcNow
            })
                           .ToList();

            messages
            .AsParallel()
            .ForAll(m => kafkaMessageBus.Publish(m).Wait());

            stopwatch.Stop();
            Log.InfoFormat("Published {0} messages in {1}", messages.Count, stopwatch.Elapsed);

            // consume
            stopwatch.Restart();
            var messagesReceived = ConsumeFromTopic(pingConsumer);

            stopwatch.Stop();
            Log.InfoFormat("Consumed {0} messages in {1}", messagesReceived.Count, stopwatch.Elapsed);

            // assert

            // all messages got back
            messagesReceived.Count.Should().Be(messages.Count);
        }
示例#3
0
        static void Main(string[] args)
        {
            Console.WriteLine("Setting up MessageBus");
            var messageBus = new MessageBusBuilder().UseLogger(new DelegateLogger(Console.WriteLine)).Build();
            var t1         = messageBus.InitializeRabbitMq("host=vboxguest.asinetwork.local;username=guest;password=guest");

            // Messages from local, with topic "send" are sent to rabbit
            var t2 = messageBus.Subscribe <MyTestPayload>(b => b
                                                          .WithTopic("send")
                                                          .ForwardToRabbitMq(r => r.UseDefaultQueue())
                                                          .OnWorker()
                                                          );

            messageBus.Subscribe <MyTestPayload>(b => b
                                                 .WithTopic("send")
                                                 .Invoke(s => Console.WriteLine("Sending: " + s.Text)));

            // Subscript to "send" topic on rabbit, and forward those messages locally on the "received" topic
            var t3 = messageBus.PullRabbitMqToLocal <MyTestPayload>(r => r
                                                                    .ForAllRemoteTopics()
                                                                    .ReceiveDefaultFormat()
                                                                    .ForwardToLocalTopic("received")
                                                                    .UseSharedQueueName()
                                                                    .AutoExpireQueue());

            // Messages from rabbit, with topic "received" get printed on the console
            var t4 = messageBus.Subscribe <MyTestPayload>(b => b
                                                          .WithTopic("received")
                                                          .InvokeEnvelope(m =>
            {
                Console.WriteLine("Received: " + m.Payload.Text);
            }));

            //Console.WriteLine("Sending message (should print 'whatever' if successful)");
            for (int i = 0; i < 100; i++)
            {
                messageBus.Publish("send", new MyTestPayload
                {
                    Text = "test message " + i
                });
                Thread.Sleep(1000);
            }

            Console.WriteLine("Press any key to continue");
            Console.ReadKey();
            messageBus.Dispose();
            Environment.Exit(0);
        }
示例#4
0
        public void BasicPubSub()
        {
            // arrange

            // ensure the topic has 2 partitions
            var topic = $"test-ping";

            var pingConsumer = new PingConsumer();

            MessageBusBuilder
            .Publish <PingMessage>(x =>
            {
                x.DefaultTopic(topic);
                // Partition #0 for even counters
                // Partition #1 for odd counters
                x.PartitionProvider((m, t) => m.Counter % 2);
            })
            .SubscribeTo <PingMessage>(x => x.Topic(topic)
                                       .Group("subscriber")
                                       .WithSubscriber <PingConsumer>()
                                       .Instances(2))
            .WithDependencyResolver(new LookupDependencyResolver(f =>
            {
                if (f == typeof(PingConsumer))
                {
                    return(pingConsumer);
                }
                throw new InvalidOperationException();
            }));

            var kafkaMessageBus = MessageBus.Value;

            // act

            // publish
            var stopwatch = Stopwatch.StartNew();

            var messages = Enumerable.Range(0, NumberOfMessages).Select(i => new PingMessage {
                Counter = i, Timestamp = DateTime.UtcNow
            }).ToList();

            messages.AsParallel().ForAll(m => MessageBus.Value.Publish(m).Wait());

            stopwatch.Stop();
            Log.InfoFormat("Published {0} messages in {1}", messages.Count, stopwatch.Elapsed);

            // consume
            stopwatch.Restart();
            var messagesReceived = ConsumeFromTopic(pingConsumer);

            stopwatch.Stop();
            Log.InfoFormat("Consumed {0} messages in {1}", messagesReceived.Count, stopwatch.Elapsed);

            // assert

            // all messages got back
            messagesReceived.Count.ShouldBeEquivalentTo(messages.Count);

            // Partition #0 => Messages with even counter
            messagesReceived
            .Where(x => x.Item2 == 0)
            .All(x => x.Item1.Counter % 2 == 0)
            .Should().BeTrue();

            // Partition #1 => Messages with odd counter
            messagesReceived
            .Where(x => x.Item2 == 1)
            .All(x => x.Item1.Counter % 2 == 1)
            .Should().BeTrue();
        }