1

我使用 zeromq 和 C 编程语言编写了一个请求-回复代理。代理将客户端请求路由到适当的服务,然后将回复路由回客户端。这些服务是用 JAVA 编写的。

有人可以解释一下如何让服务与经纪人沟通。我确信这一定是一个常见的场景,但我没有太多经验,所以有人可以帮助我使我的代码可互操作。

请假设服务不会被 zeromq 感知。在这种情况下是否要使用 node.js?我必须写一个http前端吗?

4

1 回答 1

0

这是使用异步 PUSH/PULL 套接字的一种方法。我正在对此进行伪编码,因此请自己填写空白:

假设 Java 服务是 POJO 驻留在它们自己的进程中,假设我们有一个没有 zmq 依赖项的简单服务:

public class MyJavaService{
   public Object invokeService(String params){
   }
}

现在我们构建一个 Java 委托层,它从代理中提取消息,将请求委托给 Java 服务方法,并在单独的套接字上返回响应:

//receive on this
Socket pull = ctx.createSocket(ZMQ.PULL)
pull.connect("tcp://localhost:5555")

//respond on this
Socket push = ctx.createSocket( ZMQ.PUSH)
psuch.connect("tcp://localhost:5556")

while( true){
  ZMsg msg = pull.recvMsg( pull)

  //assume the msg has 2 frames,
  //one for service to invoke,
  //the other with arguments
  String svcToInvoke = msg.popString()
  String svcArgs = msg.popString()

  if( "MyJavaService".equals(svcToInvoke)){
    ZMsg respMsg = new ZMsg()
    respMsg.push( (new MyJavaService()).invokeService( svcArgs))
    respMsg.send( push)
  }
 }

在代理端,只需创建 PUSH/PULL 套接字来与 Java 服务层通信(我不是 C++ 程序员,请见谅)

int main () {
    zmq::context_t context(1);

    zmq::socket_t push(context, ZMQ_PUSH);
    push.bind( "tcp://localhost:5555");

    // First allow 0MQ to set the identity
    zmq::socket_t pull(context, ZMQ_PULL);
    pull.bind( "tcp://localhost:5556");

    //code here to handle request/response,
    //to clients
    ..
}

使用 PUSH/PULL 适用于这种方法,但理想的方法是在服务器上使用 ROUTER,在客户端使用 DEALER,以实现完全异步通信,例如此处

希望能帮助到你!

于 2013-10-09T01:34:12.690 回答