7-EasyNetQ之Request & Response


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 >委托參數。它允許你執行持續很長時間IO密集型的操作,而不會阻塞EasyNetQ訂閱處理循環。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM