【问题标题】:How can services written in JAVA communicate with zeromq broker written in C用 JAVA 编写的服务如何与用 C 编写的 zeromq 代理通信
【发布时间】:2013-10-09 09:34:12
【问题描述】:

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

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

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

【问题讨论】:

  • 服务是 Java,但它们也是 ZeroMq 客户端吗?他们可以使用来自基于 C 的 ZeroMq 代理的消息吗?
  • 客户端和服务将是不同的实体。它们还没有写出来,但它们会(在 JAVA 中)。为了测试,我用 C 本身编写了简单的客户端和服务。我的观点是,我不希望客户和服务知道经纪人理解的 msg 格式。他们可能应该使用 JSON 与代理进行通信。
  • 了解,但 Java 服务会成为 ZeroMq 客户端吗?
  • 我不确定,但我认为要求是他们不应该担心 zeromq。如果这不可行,假设 JAVA 服务将使用 zeromq,解决方案是什么?
  • 如果 Java 服务支持 ZeroMq,则解决方案很简单,因为 ZeroMq 具有针对 C++ 和 Java 的语言绑定。您可以使用 json 作为两者之间的消息负载。 Java 服务将驻留在 C++ 应用程序中,还是驻留在它们自己的独立进程中?

标签: node.js zeromq jzmq


【解决方案1】:

这是使用异步 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,以实现完全异步通信,例如 here

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2023-03-08
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多