我有兩種節點類型。 A Server
和Client
。當前會運行一個或多個Server
或Client
。MassTransit RPC(RabbitMQ)與多個客戶端超時
使用MassTransit和RabbitMQ時,在嘗試描述here的RPC模式時出現超時。
Server
和Client
的代碼很簡單,用於測試。
代碼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層。
更改客戶端以使用rabbitmq://192.168.10.201/*?temporary = true,您將爲每個客戶端獲得一個唯一的臨時隊列。 –