0
我有2個項目:MassTransit生產者需要60秒時間消耗事件
- 一個MassTransit(Topshelf Windows服務)叫
Service.Endpoints
- 一個控制檯應用程序客戶端試圖溝通與它叫做
TestConsole
。
的總體要求是如下:
TestConsole
發送SolveProblemCommand
Service.Endpoints
消耗命令併發布ProblemSolvedEvent
TestConsole
消耗該事件。
問題:
所有上述步驟正常工作不同之處在於步驟3(TestConsole
消耗事件)僅事件發佈後會發生大約60秒。首先顯示以下錯誤(60秒後),然後消費者接到該呼叫。
Timeout waiting for consumer to exit: rabbitmq://localhost:5672/bus-PC-NAME-TestConsole.vshost-4sboyydjz6ne6mz6bdky1b7ad4?durable=false&autodelete=true&prefetch=16
超時等待使用者退出:RabbitMQ的://本地主機:5672/problemsolved.queue預取= 16
的代碼:
Service.Endpoints.csproj
bus = BusConfigurator.ConfigureBus(new AppSettings(), (cfg, host) =>
{
cfg.ReceiveEndpoint(host, RabbitMqConstants.SolveProblemQueue, e =>
{
e.Consumer<SolveProblemCommandConsumer>(NinjectConfig.CurrentKernel);
});
});
bus.Start();
class SolveProblemCommandConsumer : IConsumer<SolveProblemCommand>
{
public async Task Consume(ConsumeContext<SolveProblemCommand> context)
{
var controller = new Controller(context.Message.Problem);
var results = await controller.Start(context.Message.Options);
await context.Publish(new ProblemSolvedEvent(results));
}
}
TestConsole.csproj
var bus = BusConfigurator.ConfigureBus(new AppSettings(), (cfg, host) =>
{
cfg.ReceiveEndpoint(host, RabbitMqConstants.ProblemSolvedQueue, e =>
{
e.Consumer<ProblemSolvedEventConsumer>();
});
});
var sendToUri = new Uri($"{RabbitMqConstants.RabbitMqUri}{RabbitMqConstants.SolveProblemQueue}");
var endpoint = await bus.GetSendEndpoint(sendToUri);
bus.Start();
await endpoint.Send(someMessage);
class ProblemSolvedEventConsumer : IConsumer<ProblemSolvedEvent>
{
public async Task Consume(ConsumeContext<ProblemSolvedEvent> context)
{
...
}
}
聽起來像60秒是發送第一條消息(命令)時從控制檯命中的超時,你確定你沒有同步阻止控制檯嗎?你還沒有分享任何聽力代碼。 –
幫助我診斷這些問題最多的事情是安裝RabbitMQ的Web插件。它將允許您查看交換和隊列,以查看您的消息是否實際發送。如果你看到它坐在隊列中,那麼你知道你的消費者是不正確的。 – phil
@OlegBogdanov我想我已經分享了所有的代碼。兩個'cfg.ReceiveEndpoint()'調用,兩個'Consumer()'調用和兩個'IConsumer '類。缺少什麼代碼? –
hofnarwillie