Esempio n. 1
0
  public static boolean device(SocketBase insocket_, SocketBase outsocket_) {

    //  The algorithm below assumes ratio of requests and replies processed
    //  under full load to be 1:1.

    //  TODO: The current implementation drops messages when
    //  any of the pipes becomes full.

    boolean success;
    int rc;
    int more;
    Msg msg;
    PollItem items[] = new PollItem[2];

    items[0] = new PollItem(insocket_, ZMQ.ZMQ_POLLIN);
    items[1] = new PollItem(outsocket_, ZMQ.ZMQ_POLLIN);

    while (!Thread.currentThread().isInterrupted()) {
      //  Wait while there are either requests or replies to process.
      rc = ZMQ.zmq_poll(items, -1);
      if (rc < 0) return false;

      //  Process a request.
      if (items[0].isReadable()) {
        while (true) {
          msg = insocket_.recv(0);
          if (msg == null) break;

          more = insocket_.getsockopt(ZMQ.ZMQ_RCVMORE);

          success = outsocket_.send(msg, more > 0 ? ZMQ.ZMQ_SNDMORE : 0);
          if (!success) return false;
          if (more == 0) break;
        }
      }
      //  Process a reply.
      if (items[1].isReadable()) {
        while (true) {
          msg = outsocket_.recv(0);
          if (msg == null) break;

          more = outsocket_.getsockopt(ZMQ.ZMQ_RCVMORE);

          success = insocket_.send(msg, more > 0 ? ZMQ.ZMQ_SNDMORE : 0);
          if (!success) return false;
          if (more == 0) break;
        }
      }
    }
    return true;
  }