EasyNetQ也支持Request/Response這種方式的消息模式。這種方式很容易在client/Server應用中執行,客戶端發送一個請求到服務器,服務器然后處理請求后返回一個響應。和傳統的RPC機制不同,EasyNetQ request/response操作不需要有一個名字,僅僅需要簡單的定義一對request/response消息類型。
另外,不同於傳統的RPC機制包括了眾多的web service 工具集,EasyNetQ的request/response模式是基於消息傳遞,因此它是開箱即用型的異步模式。
發送請求,處理響應
用EasyNet發送請求,調用IBus上的Request方法。
var myRequest = new MyRequest{Text ="hello Server"};
var response = bus.Request<MyRequest, MyResponse>(myRequest);
Console.WriteLine(response.Text);
這里我們創建了一個新的類型為MyRequest的請求,然后調用Request方法,並用這個消息作為它的參數。當這個response響應返回時,消息的Text屬性值輸出到控制台。
異步請求
消息天然是異步的。你發送一個消息,然后允許你的程序繼續執行其他任務。在之后的某一個時間點上,你收到響應。用異步Request方法實現上面的方法,你的線程將阻塞直到響應返回。通常來說,使用RequestAsync方法返回一個Task是比較好的選擇。
var task = bus.RequestAsync<TestRequestMessage,TestResponseMessage>(request);
task.ContinueWith(response =>{
Console.WriteLine("Got Response:{0}",
response.Result.Text);
});
響應請求
去寫一個響應請求的服務,簡單使用IBus.Respond方法。如下:
bus.Respond<MyRequest,MyResponse>(request =>
new MyResponse{ Text ="Responding to " + request.Text});
Respond帶有單個參數,一個Func<TRequest, TResponse>,接收一個請求並返回響應。同樣的建議適用於訂閱回調也適用於responder。不要被持續很長時間的IO操作所阻塞。假如你有持續很長時間的IO,應該使用ResponseAsync。
異步響應
EasynetQ也提供了一個RespondAsync 方法,它帶有一個Func<TRequest,Task
static void Main(string[] args)
{
//創建一組工作線程對象。
var workers = new BlockingCollection<MyWorkder>();
for(int i = 0; i < 10; i++)
{
workers.Add(new MyWorker());
}
//創建一個Bus
var bus = RabbitHutch.CreateBus("host=localhost");
//響應請求。
bus.RespondAsync<RequestServerTime, ResponseServerTime>(
request =>
Task.Factory.StartNew(() =>
{
var worker = worker.Take();
try
{
return worker.Execute(request);
}
finally
{
workers.Add(worker);
}
}));
Console.ReadLine();
bus.Dispose();
}
示例應用
EasynetQ展示Request Response和Autosubcriber,連上使用Windsor IOC的示例代碼地址如下:
https://bitbucket.org/philipogorman/createrequestservice/src
英文地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Request-Response