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(); } }
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(); } }