2015-07-05 40 views
0

我有兩種節點類型。 A ServerClient。當前會運行一個或多個ServerClientMassTransit RPC(RabbitMQ)與多個客戶端超時

使用MassTransit和RabbitMQ時,在嘗試描述here的RPC模式時出現超時。

ServerClient的代碼很簡單,用於測試。

代碼Server

class Program 
{ 
    static void Main(string[] args) 
    { 
     var serviceBus = ServiceBusFactory.New(sbc => 
     { 
      sbc.UseRabbitMq(); 
      sbc.ReceiveFrom("rabbitmq://192.168.10.201/mybus_responder"); 

      sbc.Subscribe(x => 
      { 
       x.Handler<TestEvent>((ctx, @event) => 
       { 
        Console.WriteLine("Received message " + @event.Message); 
        ctx.Respond(new TestEventResponse { Response = "Processed message \"" + @event.Message + "\"" }); 
       }); 

       x.Handler<TestEvent2>((ctx, @event) => 
       { 
        Console.WriteLine("Received message " + @event.Message); 
        ctx.Respond(new TestEventResponse2 { Response = "Processed message \"" + @event.Message + "\"" }); 
       }); 
      }); 
     }); 

     Console.WriteLine("Listening for events..."); 
     Console.ReadLine(); 
    } 
} 

代碼Client

class Program 
{ 
    static void Main(string[] args) 
    { 
     var serviceBus = ServiceBusFactory.New(sbc => 
     { 
      sbc.UseRabbitMq(); 
      sbc.ReceiveFrom("rabbitmq://192.168.10.201/mybus"); 
     }); 

     Console.WriteLine("Ready to send events..."); 

     var eventType = false; 

     while (true) 
     { 
      eventType = !eventType; 

      var message = Path.GetFileNameWithoutExtension(Path.GetRandomFileName()); 

      Console.WriteLine("Sending message " + message); 

      if (eventType) 
      { 
       serviceBus.PublishRequest(new TestEvent {Message = message}, configurator => 
       { 
        configurator.Handle<TestEventResponse>(response => 
        { 
         Console.WriteLine(response.Response); 
        }); 
        configurator.SetTimeout(TimeSpan.FromSeconds(5)); 
       }); 
      } 
      else 
      { 
       serviceBus.PublishRequest(new TestEvent2 {Message = message}, configurator => 
       { 
        configurator.Handle<TestEventResponse2>(response => 
        { 
         Console.WriteLine(response.Response); 
        }); 
        configurator.SetTimeout(TimeSpan.FromSeconds(5)); 
       }); 
      } 
     } 
    } 
} 

如果我運行完全1的每個節點類型的,命令/響應達到預期效果。如果我有超過1個Server實例,則命令/響應按預期執行,在每個「服務器」節點之間均勻分配Client請求。

但是,如果我有多個Client實例在運行,我會在Client端超時。

這是爲什麼?我需要支持多個```Client``實例,因爲這是我的Web層。

+0

更改客戶端以使用rabbitmq://192.168.10.201/*?temporary = true,您將爲每個客戶端獲得一個唯一的臨時隊列。 –

回答

2

是的,我相信這只是因爲你最終在實例之間共享一個隊列,並且他們吞噬了對方的消息。每個客戶端和服務器都需要一個獨特的隊列來讀取。

+0

我不知道MassTransit如何管理隊列。我只是在EasyNetQ中試過,並且工作完美無瑕。安裝很容易。我決定不使用MassTransit。這對於傳輸不可知的實現很有好處,但對我來說太過分了。 –