请看下面的用例。使用底层请求/响应协议(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是我最初的想法,并且我没有发现任何其他有用的东西。
代码不会编译,我想这只是想象我的想法。
我的问题之一是关联请求/响应消息。是否有一些关于该主题的标准程序/模式或文献可能知道? – reindeer
这一切都取决于协议。如果您使用JAIN-SIP之类的SIP库,我相信它可以将响应与请求关联起来。 –