用 JAVA 编写的服务如何与用 C 编写的 zeromq 代理进行通信



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

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

请假设服务不会识别零mq。在这种情况下,节点.js是否要使用?我必须编写一个 http 前端吗?

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

假设 Java 服务驻留在自己的进程中,假设我们有一个简单的服务,没有 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,以实现完全异步通信,此处的示例。

希望对您有所帮助!

相关内容

  • 没有找到相关文章

最新更新