2014-06-24 78 views
0

請看下面的用例。使用底層請求/響應協議(SIP上的JSON-RPC)實現RPC

我有一個客戶端(Java)應用程序,它想要獲取/設置另一個遠程應用程序(C)的狀態。它們之間的通信是通過在另一個線程中運行的SIP完成的。

。SIP接口可以執行以下操作:

的sendMessage onRequest

我對架構兩種思路:

RPC(JSON-RPC)

定義一個類它對JSONRPCRequests和JSONRPCResponse進行編組/解組(http://software.dzhuvinov.com/json-rpc-2.0-base.html

定義一個Invoker類,它有一個類似調用(服務器,名稱,參數)方法的東西。

在祈求類,名稱和參數放入JSONRPCRequest並通過SIP層的sendMessage

現在到了我的問題發送。我怎樣才能讓回到調用者的權利?控制流程如下:

onRequest方法被調用,但我現在知道它是否是我以前調用的答案。我所做的就是將所有響應到達我的服務器到一個地圖,並在調用者中輪詢該列表。

粗略的草圖可能是;

調用器(提供API,以客戶端)

class Invoker { 

    private Channel channel; 

    public Invoker(Channel channel) { this.channel = channel; } 

    public Object call(String server, String name, Object .. args) { 
     JSONRPCRequest req = ...; 
     channel.sendMessage(server, req.toString()); 
     while(! channel.hasResponse(req.id()) { 
      Thread.sleep(42); 
     } 
     return channel.getResponse(req.id()).result();   
    } 

} 

信道(接口信使):

class Channel { 

    private Map<Object, JSONRPCResponse> responses = new //; 

    private Sip sip = new Sip() { 
     public void onRequest(String msg) { 
      JSONRPCResponse response = JSONRPCResponse.parse(msg); 
      responses.put(msg.id(), response); 
     } 
    }; 

    public void sendMessage(String server, String message) { 
     sip.sendMessage(); 
    } 

    public boolean hasResponse onRequest(Object id) { 
     responses.hasKey(id); 
    } 

    public JSONRPCResponse getResponse(Object id) { 
     responses.get(id); 
     responses.delete(id); 
    } 

} 

SIP(​​信使本身):

abstract class Sip { 

    public void sendMessage(String msg) { 
     // SIP magic 
    } 

    public abstract void onRequest(String msg);  
} 

有沒有更好的方法來做到這一點?我最大的問題/代碼的氣味是:

  • 阻塞在祈求
  • 該協議在祈求,也許我想改用編組到別的東西
  • 地圖爲平均得到了正確的響應要求
  • 的SIP抽象方法看起來很奇怪
  • 沒有錯誤處理
  • 無超時

消息傳遞

是否有一種簡單的方法來擺脫RPC,並實現類似RPC的消息傳遞?歡迎任何模式提示。我不需要代碼本身,我對於架構完全沒有問題。我嘗試谷歌消息傳遞實現,以及他們如何實際改變狀態,但我沒有發現任何有用的東西。如何實現超時/錯誤處理?

任何有關該主題的優秀書籍/文獻也是受歡迎的,因爲我從未編寫過這樣的分發內容。

在SIP內部使用哪種協議來改變狀態的任何其他想法也是受歡迎的,因爲RPC是我最初的想法,並且我沒有發現任何其他有用的東西。

代碼不會編譯,我想這只是想象我的想法。

回答

1

定義一個對我們有用的方法有意義的服務接口。相反,使用的是阻塞調用,在客戶端提供一個對ResponseHandler會被調用當操作完成:

interface ResponseHandler { 
    void onComplete(Response response); 
    void onError(Throwable error); 
} 

interface SomeService { 
    void set(String attribute, Object value, ResponsHandler responseHandler); 
    void get(String attribute, ResponseHandler responseHandler); 
} 

服務接口可以使用任何合適的協議的執行,但它與響應關聯請求爲了調用正確的回調。

+0

我的問題之一是關聯請求/響應消息。是否有一些關於該主題的標準程序/模式或文獻可能知道? – reindeer

+0

這一切都取決於協議。如果您使用JAIN-SIP之類的SIP庫,我相信它可以將響應與請求關聯起來。 –