2017-01-18 77 views
1

我想嘗試使用Cap'n Proto C++ RPC來承諾流水線,但我不知道該怎麼做。Cap'n Proto和承諾流水線

這裏是我的架構:

interface Test { 
    getInt @0() -> (intResult :Int32); 
    increment @1 (intParam :Int32) -> (intResult :Int32); 
} 

這裏是我想要做的(僞代碼)是什麼:

increment(getInt()); 

我試圖做這樣的事情:

auto request1 = test.getIntRequest(); 
auto promise = request1.send(); 

auto request2 = test.incrementRequest(); 
request2.setIntParam(promise.getIntResult()) // HERE IS THE PROBLEM 
auto promise2 = request2.send(); 

但它不是使用承諾的好方法。 我希望你明白我想要做什麼。

謝謝。

編輯:另一個問題:如何實現服務器上的方法?

我寫了這個代碼:

#include <kj/debug.h> 
#include <capnp/ez-rpc.h> 
#include <capnp/message.h> 
#include <iostream> 
#include "test.capnp.h" 

using namespace std; 


class TestI : virtual public Test::Server 
{ 
public: 
     TestI() {} 
     ::kj::Promise<void> getInt(GetIntContext context) 
     { 
      // ???? 
     } 
     ::kj::Promise<void> increment(IncrementContext context) 
     { 
      // ???? 
     } 
}; 

class Int32BoxI : virtual public Int32Box::Server 
{ 
private: 
     int val = 12; 
public: 
     Int32BoxI(int value): val(value) {} 
     ::kj::Promise<void> get(GetContext context) 
     { 
      context.getResults().setValue(this->val); 
      return kj::READY_NOW; 
     } 
} 

,但我不知道如何實現getInt()和增量()。

回答

2

這裏的問題是,你正在嘗試對int進行流水線處理,但流水線處理只能用於對象引用。您可以通過封裝int類型的對象,像這樣解決這個問題:

interface Int32Box { 
    get @0() -> (value :Int32); 
} 

interface Test { 
    getInt @0() -> (intResult :Int32Box); 
    increment @1 (intParam :Int32Box) -> (intResult :Int32Box); 
} 

現在,你的代碼將作爲寫入。

當然,現在您必須另外撥打.get()在最後的Int32Box才能讀取該值。幸運的是,您可以管理此呼叫,以便它不需要任何額外的網絡往返。

auto request1 = test.getIntRequest(); 
auto promise = request1.send(); 

auto request2 = test.incrementRequest(); 
request2.setIntParam(promise.getIntResult()); 
auto promise2 = request2.send(); 

auto request3 = promise2.getIntResult().getRequest(); 
auto promise3 = request3.send(); 

// This is the only wait! 
int finalResult = promise3.wait().getValue(); 

上述順序僅執行一次網絡往返。

+0

謝謝你的回答。現在對我來說更清楚了。但是,我在服務器上實現這些方法有一些困難。我編輯了我的第一篇文章,向您展示我的問題。再次感謝你。 –

+1

@ B.Clement我建議查看Cap'n Proto存儲庫中的「計算器」示例 - 它與您正在做的非常相似。請參閱:https://github.com/sandstorm-io/capnproto/tree/master/c++/samples –