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; }