node.js - JAVA编写的服务如何与C编写的zeromq代理通信

标签 node.js zeromq jzmq

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

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

请假设服务不支持 Zeromq。这种场景要用node.js吗?我需要编写一个 http 前端吗?

最佳答案

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

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

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

现在我们构建一个 Java 委托(delegate)层,它从代理中提取消息,将请求委托(delegate)给 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,以实现完全异步通信,例如 here

希望对你有帮助!

关于node.js - JAVA编写的服务如何与C编写的zeromq代理通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19253867/

相关文章:

javascript - 在 ejs 循环中无法访问某些对象值

node.js - 如何解决nexe编译代码2错误?

c++ - 如何使用 std::istringstream 获取正确的缓冲区大小以进行数据解析

javascript - Node.js 中的 Facebook Messenger 机器人

javascript - 异步node.js :nested array with callback

windows - 为什么 ZeroMQ PGM 多播接收卡在中间并且没有进一步接收数据包

java - 0MQ - JZMQ 不满意链接错误

java - ZMQ - 具有多个前端服务实例和后端工作人员的请求/响应

redis - 改进泰坦尼克模式的性能

c++ - zeromq 3.1 C++ API 'device' 不是 'zmq' 的成员