Search in sources :

Example 21 with ZFrame

use of org.zeromq.ZFrame in project jeromq by zeromq.

the class lbbroker3 method main.

/**
     * And the main task now sets-up child tasks, then starts its reactor.
     * If you press Ctrl-C, the reactor exits and the main task shuts down.
     */
public static void main(String[] args) {
    ZContext context = new ZContext();
    LBBroker arg = new LBBroker();
    //  Prepare our context and sockets
    arg.frontend = context.createSocket(ZMQ.ROUTER);
    arg.backend = context.createSocket(ZMQ.ROUTER);
    arg.frontend.bind("ipc://frontend.ipc");
    arg.backend.bind("ipc://backend.ipc");
    int clientNbr;
    for (clientNbr = 0; clientNbr < NBR_CLIENTS; clientNbr++) ZThread.start(new ClientTask());
    for (int workerNbr = 0; workerNbr < NBR_WORKERS; workerNbr++) ZThread.start(new WorkerTask());
    //  Queue of available workers
    arg.workers = new LinkedList<ZFrame>();
    //  Prepare reactor and fire it up
    ZLoop reactor = new ZLoop(context);
    PollItem item = new PollItem(arg.backend, ZMQ.Poller.POLLIN);
    reactor.addPoller(item, backendHandler, arg);
    reactor.start();
    context.destroy();
}
Also used : ZFrame(org.zeromq.ZFrame) PollItem(org.zeromq.ZMQ.PollItem) ZLoop(org.zeromq.ZLoop) ZContext(org.zeromq.ZContext)

Example 22 with ZFrame

use of org.zeromq.ZFrame in project jeromq by zeromq.

the class mdwrkapi method receive.

/**
     * Send reply, if any, to broker and wait for next request.
     */
public ZMsg receive(ZMsg reply) {
    // Format and send the reply if we were provided one
    assert (reply != null || !expectReply);
    if (reply != null) {
        assert (replyTo != null);
        reply.wrap(replyTo);
        sendToBroker(MDP.W_REPLY, null, reply);
        reply.destroy();
    }
    expectReply = true;
    while (!Thread.currentThread().isInterrupted()) {
        // Poll socket for a reply, with timeout
        ZMQ.Poller items = ctx.createPoller(1);
        items.register(worker, ZMQ.Poller.POLLIN);
        if (items.poll(timeout) == -1)
            // Interrupted
            break;
        if (items.pollin(0)) {
            ZMsg msg = ZMsg.recvMsg(worker);
            if (msg == null)
                // Interrupted
                break;
            if (verbose) {
                log.format("I: received message from broker: \n");
                msg.dump(log.out());
            }
            liveness = HEARTBEAT_LIVENESS;
            // Don't try to handle errors, just assert noisily
            assert (msg != null && msg.size() >= 3);
            ZFrame empty = msg.pop();
            assert (empty.getData().length == 0);
            empty.destroy();
            ZFrame header = msg.pop();
            assert (MDP.W_WORKER.frameEquals(header));
            header.destroy();
            ZFrame command = msg.pop();
            if (MDP.W_REQUEST.frameEquals(command)) {
                // We should pop and save as many addresses as there are
                // up to a null part, but for now, just save one
                replyTo = msg.unwrap();
                command.destroy();
                // We have a request to process
                return msg;
            } else if (MDP.W_HEARTBEAT.frameEquals(command)) {
            // Do nothing for heartbeats
            } else if (MDP.W_DISCONNECT.frameEquals(command)) {
                reconnectToBroker();
            } else {
                log.format("E: invalid input message: \n");
                msg.dump(log.out());
            }
            command.destroy();
            msg.destroy();
        } else if (--liveness == 0) {
            if (verbose)
                log.format("W: disconnected from broker - retrying\n");
            try {
                Thread.sleep(reconnect);
            } catch (InterruptedException e) {
                // Restore the
                Thread.currentThread().interrupt();
                // interrupted status
                break;
            }
            reconnectToBroker();
        }
        // Send HEARTBEAT if it's time
        if (System.currentTimeMillis() > heartbeatAt) {
            sendToBroker(MDP.W_HEARTBEAT, null, null);
            heartbeatAt = System.currentTimeMillis() + heartbeat;
        }
    }
    if (Thread.currentThread().isInterrupted())
        log.format("W: interrupt received, killing worker\n");
    return null;
}
Also used : ZFrame(org.zeromq.ZFrame) ZMsg(org.zeromq.ZMsg) ZMQ(org.zeromq.ZMQ)

Example 23 with ZFrame

use of org.zeromq.ZFrame in project jeromq by zeromq.

the class mdbroker method processClient.

/**
     * Process a request coming from a client.
     */
private void processClient(ZFrame sender, ZMsg msg) {
    // Service name + body
    assert (msg.size() >= 2);
    ZFrame serviceFrame = msg.pop();
    // Set reply return address to client sender
    msg.wrap(sender.duplicate());
    if (serviceFrame.toString().startsWith(INTERNAL_SERVICE_PREFIX))
        serviceInternal(serviceFrame, msg);
    else
        dispatch(requireService(serviceFrame), msg);
    serviceFrame.destroy();
}
Also used : ZFrame(org.zeromq.ZFrame)

Example 24 with ZFrame

use of org.zeromq.ZFrame in project jeromq by zeromq.

the class mdbroker method mediate.

// ---------------------------------------------------------------------
/**
     * Main broker work happens here
     */
public void mediate() {
    while (!Thread.currentThread().isInterrupted()) {
        ZMQ.Poller items = ctx.createPoller(1);
        items.register(socket, ZMQ.Poller.POLLIN);
        if (items.poll(HEARTBEAT_INTERVAL) == -1)
            // Interrupted
            break;
        if (items.pollin(0)) {
            ZMsg msg = ZMsg.recvMsg(socket);
            if (msg == null)
                // Interrupted
                break;
            if (verbose) {
                log.format("I: received message:\n");
                msg.dump(log.out());
            }
            ZFrame sender = msg.pop();
            ZFrame empty = msg.pop();
            ZFrame header = msg.pop();
            if (MDP.C_CLIENT.frameEquals(header)) {
                processClient(sender, msg);
            } else if (MDP.W_WORKER.frameEquals(header))
                processWorker(sender, msg);
            else {
                log.format("E: invalid message:\n");
                msg.dump(log.out());
                msg.destroy();
            }
            sender.destroy();
            empty.destroy();
            header.destroy();
        }
        purgeWorkers();
        sendHeartbeats();
    }
    // interrupted
    destroy();
}
Also used : ZFrame(org.zeromq.ZFrame) ZMsg(org.zeromq.ZMsg) ZMQ(org.zeromq.ZMQ)

Example 25 with ZFrame

use of org.zeromq.ZFrame in project jeromq by zeromq.

the class mdbroker method processWorker.

/**
     * Process message sent to us by a worker.
     */
private void processWorker(ZFrame sender, ZMsg msg) {
    // At least, command
    assert (msg.size() >= 1);
    ZFrame command = msg.pop();
    boolean workerReady = workers.containsKey(sender.strhex());
    Worker worker = requireWorker(sender);
    if (MDP.W_READY.frameEquals(command)) {
        // Not first command in session || Reserved service name
        if (workerReady || sender.toString().startsWith(INTERNAL_SERVICE_PREFIX))
            deleteWorker(worker, true);
        else {
            // Attach worker to service and mark as idle
            ZFrame serviceFrame = msg.pop();
            worker.service = requireService(serviceFrame);
            workerWaiting(worker);
            serviceFrame.destroy();
        }
    } else if (MDP.W_REPLY.frameEquals(command)) {
        if (workerReady) {
            // Remove & save client return envelope and insert the
            // protocol header and service name, then rewrap envelope.
            ZFrame client = msg.unwrap();
            msg.addFirst(worker.service.name);
            msg.addFirst(MDP.C_CLIENT.newFrame());
            msg.wrap(client);
            msg.send(socket);
            workerWaiting(worker);
        } else {
            deleteWorker(worker, true);
        }
    } else if (MDP.W_HEARTBEAT.frameEquals(command)) {
        if (workerReady) {
            worker.expiry = System.currentTimeMillis() + HEARTBEAT_EXPIRY;
        } else {
            deleteWorker(worker, true);
        }
    } else if (MDP.W_DISCONNECT.frameEquals(command))
        deleteWorker(worker, false);
    else {
        log.format("E: invalid message:\n");
        msg.dump(log.out());
    }
    msg.destroy();
}
Also used : ZFrame(org.zeromq.ZFrame)

Aggregations

ZFrame (org.zeromq.ZFrame)27 ZMsg (org.zeromq.ZMsg)20 ZContext (org.zeromq.ZContext)13 Socket (org.zeromq.ZMQ.Socket)13 Poller (org.zeromq.ZMQ.Poller)7 ArrayList (java.util.ArrayList)4 Random (java.util.Random)4 ZMQ (org.zeromq.ZMQ)4 PollItem (org.zeromq.ZMQ.PollItem)3 IOException (java.io.IOException)2 ZLoop (org.zeromq.ZLoop)2 DataInputStream (java.io.DataInputStream)1 DataOutputStream (java.io.DataOutputStream)1 File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 FileOutputStream (java.io.FileOutputStream)1 RandomAccessFile (java.io.RandomAccessFile)1 HashMap (java.util.HashMap)1 LinkedList (java.util.LinkedList)1