2016-11-10 49 views
0

我有2個項目:MassTransit生產者需要60秒時間消耗事件

  1. 一個MassTransit(Topshelf Windows服務)叫Service.Endpoints
  2. 一個控制檯應用程序客戶端試圖溝通與它叫做TestConsole

的總體要求是如下:

  1. TestConsole發送SolveProblemCommand
  2. Service.Endpoints消耗命令併發布ProblemSolvedEvent
  3. 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) 
    { 
     ... 
    } 
} 
+0

聽起來像60秒是發送第一條消息(命令)時從控制檯命中的超時,你確定你沒有同步阻止控制檯嗎?你還沒有分享任何聽力代碼。 –

+0

幫助我診斷這些問題最多的事情是安裝RabbitMQ的Web插件。它將允許您查看交換和隊列,以查看您的消息是否實際發送。如果你看到它坐在隊列中,那麼你知道你的消費者是不正確的。 – phil

+0

@OlegBogdanov我想我已經分享了所有的代碼。兩個'cfg.ReceiveEndpoint()'調用,兩個'Consumer ()'調用和兩個'IConsumer '類。缺少什麼代碼? – hofnarwillie

回答

0

TestConsole.csproj項目中,我重新使用相同的IBusControl對象來發送命令並使用該事件。一旦我創建了兩個獨立的總線對象,它按預期工作。