Пример #1
0
        public async Task Should_receive_concurrently()
        {
            TaskCompletionSource <ConsumeContext <KafkaMessage> > taskCompletionSource = GetTask <ConsumeContext <KafkaMessage> >();
            var services = new ServiceCollection();

            services.AddSingleton(taskCompletionSource);

            services.TryAddSingleton <ILoggerFactory>(LoggerFactory);
            services.TryAddSingleton(typeof(ILogger <>), typeof(Logger <>));

            services.AddMassTransit(x =>
            {
                x.UsingInMemory((context, cfg) => cfg.ConfigureEndpoints(context));
                x.AddRider(rider =>
                {
                    rider.AddConsumer <KafkaMessageConsumer>();

                    rider.UsingKafka((context, k) =>
                    {
                        k.Host("localhost:9092");

                        k.TopicEndpoint <KafkaMessage>(Topic, nameof(Receive_Specs), c =>
                        {
                            c.ConfigureConsumer <KafkaMessageConsumer>(context);

                            c.CheckpointMessageCount = 10;
                            c.ConcurrencyLimit       = 100;
                        });
                    });
                });
            });

            var provider = services.BuildServiceProvider();

            var busControl = provider.GetRequiredService <IBusControl>();

            var observer = GetConsumeObserver();

            busControl.ConnectConsumeObserver(observer);

            await busControl.StartAsync(TestCancellationToken);

            try
            {
                var config = new ProducerConfig {
                    BootstrapServers = "localhost:9092"
                };

                using IProducer <Null, KafkaMessage> p = new ProducerBuilder <Null, KafkaMessage>(config)
                                                         .SetValueSerializer(new MassTransitJsonSerializer <KafkaMessage>())
                                                         .Build();

                var kafkaMessage = new KafkaMessageClass("test");
                var sendContext  = new MessageSendContext <KafkaMessage>(kafkaMessage);
                var message      = new Message <Null, KafkaMessage>
                {
                    Value   = kafkaMessage,
                    Headers = DictionaryHeadersSerialize.Serializer.Serialize(sendContext)
                };

                await Task.WhenAll(Enumerable.Range(0, 100).Select(x => p.ProduceAsync(Topic, message)));

                ConsumeContext <KafkaMessage> result = await taskCompletionSource.Task;

                Assert.AreEqual(message.Value.Text, result.Message.Text);
                Assert.AreEqual(sendContext.MessageId, result.MessageId);
                Assert.That(result.DestinationAddress, Is.EqualTo(new Uri($"loopback://localhost/{KafkaTopicAddress.PathPrefix}/{Topic}")));

                Assert.That(await observer.Messages.Any <KafkaMessage>());
            }
            finally
            {
                await busControl.StopAsync(TestCancellationToken);

                await provider.DisposeAsync();
            }
        }
Пример #2
0
        public async Task Should_receive()
        {
            TaskCompletionSource <ConsumeContext <KafkaMessage> > taskCompletionSource     = GetTask <ConsumeContext <KafkaMessage> >();
            TaskCompletionSource <ConsumeContext <BusPing> >      pingTaskCompletionSource = GetTask <ConsumeContext <BusPing> >();

            var services = new ServiceCollection();

            services.AddSingleton(taskCompletionSource);
            services.AddSingleton(pingTaskCompletionSource);

            services.TryAddSingleton <ILoggerFactory>(LoggerFactory);
            services.TryAddSingleton(typeof(ILogger <>), typeof(Logger <>));

            services.AddMassTransit(x =>
            {
                x.AddConsumer <BusPingConsumer>();
                x.UsingInMemory((context, cfg) => cfg.ConfigureEndpoints(context));
                x.AddRider(rider =>
                {
                    rider.AddConsumer <KafkaMessageConsumer>();

                    rider.UsingKafka((context, k) =>
                    {
                        k.Host("localhost:9092");

                        k.TopicEndpoint <KafkaMessage>(Topic, nameof(Receive_Specs), c =>
                        {
                            c.AutoOffsetReset = AutoOffsetReset.Earliest;
                            c.ConfigureConsumer <KafkaMessageConsumer>(context);
                        });
                    });
                });
            });

            var provider = services.BuildServiceProvider();

            var busControl = provider.GetRequiredService <IBusControl>();

            await busControl.StartAsync(TestCancellationToken);

            try
            {
                var config = new ProducerConfig {
                    BootstrapServers = "localhost:9092"
                };

                using IProducer <Null, KafkaMessage> p = new ProducerBuilder <Null, KafkaMessage>(config)
                                                         .SetValueSerializer(new MassTransitJsonSerializer <KafkaMessage>())
                                                         .Build();

                var kafkaMessage = new KafkaMessageClass("test");
                var sendContext  = new MessageSendContext <KafkaMessage>(kafkaMessage);
                var message      = new Message <Null, KafkaMessage>
                {
                    Value   = kafkaMessage,
                    Headers = DictionaryHeadersSerialize.Serializer.Serialize(sendContext)
                };

                await p.ProduceAsync(Topic, message);

                ConsumeContext <KafkaMessage> result = await taskCompletionSource.Task;
                ConsumeContext <BusPing>      ping   = await pingTaskCompletionSource.Task;

                Assert.AreEqual(result.CorrelationId, ping.InitiatorId);

                Assert.That(ping.SourceAddress, Is.EqualTo(new Uri($"loopback://localhost/{KafkaTopicAddress.PathPrefix}/{Topic}")));
            }
            finally
            {
                await busControl.StopAsync(TestCancellationToken);

                await provider.DisposeAsync();
            }
        }