標籤:return adl 響應 exe 同步 factor link 訊息傳遞 用戶端
EasyNetQ還支援要求/響應訊息傳遞模式。 這使得用戶端/伺服器應用程式變得容易,客戶機/伺服器應用程式在用戶端向伺服器發出請求,然後處理請求並返迴響應。 與傳統的RPC機制不同,EasyNetQ請求/響應操作不具有名稱,而是簡單地由請求/響應訊息類型對定義。
此外,與傳統的RPC機制(包括大多數Web服務工具包)不同,EasyNetQ的請求/響應模式基於訊息傳遞,因此它是非同步開箱即用的。
提出請求,並處理響應
要使用EasyNetQ發出請求,請在IBus上調用Request方法:
var myRequest = new MyRequest { Text = “Hello Server” };var response = bus.Request<MyRequest, MyResponse>(myRequest);Console.WriteLine(response.Text);
這裡我們建立一個MyMessage類型的新請求,然後調用Request方法,該訊息作為參數。 當響應返回時,響應訊息的Text屬性被輸出到控制台。
非同步請求
訊息傳遞本質上是非同步。 您發送訊息,然後允許您的程式繼續其他任務。 在將來的某一時刻,您會收到回應。 使用上面顯示的同步要求方法,您的線程將阻塞,直到返迴響應。 使用RequestAsync方法返回任務通常是一個更好的選擇:
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});
響應採用一個參數,一個需要請求並返迴響應的Func <TRequest,TResponse>。 適用於訂閱回調的相同建議也適用於響應者。 不要阻止長時間啟動並執行IO操作。 如果要執行長時間啟動並執行IO,請改用RespondAsync。
非同步響應
EasyNetQ還提供了一個RespondAsync方法,它使用Func <TRequest,Task <TResponse >>委託。 這允許您執行長時間啟動並執行IO綁定操作,而不會阻止EasyNetQ訂閱處理迴圈。
static void Main(string[] args) { //建立一組工作對象 var workers = new BlockingCollection<MyWorker>(); 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 = workers.Take(); try { return worker.Execute(request); } finally { workers.Add(worker); } })); Console.ReadLine(); bus.Dispose(); }
應用程式範例
EasyNetQ樣本顯示請求響應和Autosubcriber,使用Windsor IOC進行串連
https://bitbucket.org/philipogorman/createrequestservice/src
4,EasyNetQ-Request Response