Ainda novo no MassTransit e encontrando problemas ao tentar usar solicitações MT8 em scripts LINQPad. Eu tenho uma instância de gerenciamento RabbitMQ criada localmente no Docker, que funciona com aplicativos de console .NET, mas devo estar perdendo alguns requisitos para usar o MT8 diretamente do LINQPad 7.
Aqui está um exemplo básico que fiz para demonstrar meu erro:
async Task Main()
{
IServiceCollection services = new ServiceCollection();
services.AddMassTransit(x =>
{
x.AddConsumer(typeof(MyConsumer));
x.UsingRabbitMq((ctx, cfg) =>
{
cfg.Host("localhost", 5672, "/", h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ConfigureEndpoints(ctx);
});
});
var serviceProvider = services.BuildServiceProvider();
var bus = serviceProvider.GetService<IBus>();
var response = await bus.Request<MyRequest, MyResponse>(new MyRequest("Hi there"));
response.Message.Dump("Response");
}
namespace MyNamespace
{
public class MyRequest
{
public MyRequest() { }
public MyRequest(string phrase)
{
Phrase = phrase;
}
public string Phrase { get; set; }
}
public class MyResponse
{
public MyResponse() { }
public MyResponse(string phrase)
{
Phrase = phrase;
}
public string Phrase { get; set; }
}
public class MyConsumer : IConsumer<MyRequest>
{
public async Task Consume(ConsumeContext<MyRequest> context)
{
await context.RespondAsync(new MyResponse($"'{context.Message.Phrase}' to you too!"));
}
}
}
Meu container RabbitMQ parece receber a mensagem (e criar uma troca temporária), mas não consegue encaminhá-la de volta...
Depois de 30 segundos, a exceção é lançada:
RequestTimeoutException: Tempo limite de espera de resposta
As mensagens são enviadas corretamente do LINQPad com esse método, e os consumidores configurados em aplicativos de console .NET podem consumi-las sem problemas. Mas não posso fazer solicitações/respostas do LINQPad, que é meu objetivo final aqui.
Desde já, obrigado :)
Uau, faz anos desde que vi alguém usar o LINQpad.
E ainda mais desde que tive que dizer às pessoas que elas precisam ligar o ônibus .
O MassTransit usa um serviço hospedado para iniciar o ônibus, que normalmente é invocado pelo host genérico subjacente integrado ao .NET.
Como você não está usando o host, precisará sair
IBusControl
do contêiner e iniciar o ônibus. E sim, você também precisará pará-lo depois de terminar.