2014-06-24 49 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库,我相信它可以将响应与请求关联起来。 –