Search in sources :

Example 1 with Poller

use of org.zeromq.ZMQ.Poller in project jeromq by zeromq.

the class bstarcli method main.

public static void main(String[] argv) throws Exception {
    ZContext ctx = new ZContext();
    String[] server = { "tcp://localhost:5001", "tcp://localhost:5002" };
    int serverNbr = 0;
    System.out.printf("I: connecting to server at %s...\n", server[serverNbr]);
    Socket client = ctx.createSocket(ZMQ.REQ);
    client.connect(server[serverNbr]);
    Poller poller = ctx.createPoller(1);
    poller.register(client, ZMQ.Poller.POLLIN);
    int sequence = 0;
    while (!Thread.currentThread().isInterrupted()) {
        //  We send a request, then we work to get a reply
        String request = String.format("%d", ++sequence);
        client.send(request);
        boolean expectReply = true;
        while (expectReply) {
            //  Poll socket for a reply, with timeout
            int rc = poller.poll(REQUEST_TIMEOUT);
            if (rc == -1)
                //  Interrupted
                break;
            if (poller.pollin(0)) {
                //  We got a reply from the server, must match getSequence
                String reply = client.recvStr();
                if (Integer.parseInt(reply) == sequence) {
                    System.out.printf("I: server replied OK (%s)\n", reply);
                    expectReply = false;
                    //  One request per second
                    Thread.sleep(1000);
                } else
                    System.out.printf("E: bad reply from server: %s\n", reply);
            } else {
                System.out.printf("W: no response from server, failing over\n");
                //  Old socket is confused; close it and open a new one
                poller.unregister(client);
                ctx.destroySocket(client);
                serverNbr = (serverNbr + 1) % 2;
                Thread.sleep(SETTLE_DELAY);
                System.out.printf("I: connecting to server at %s...\n", server[serverNbr]);
                client = ctx.createSocket(ZMQ.REQ);
                client.connect(server[serverNbr]);
                poller.register(client, ZMQ.Poller.POLLIN);
                //  Send request again, on new socket
                client.send(request);
            }
        }
    }
    ctx.destroy();
}
Also used : ZContext(org.zeromq.ZContext) Socket(org.zeromq.ZMQ.Socket) Poller(org.zeromq.ZMQ.Poller)

Example 2 with Poller

use of org.zeromq.ZMQ.Poller in project jeromq by zeromq.

the class lbbroker2 method main.

/**
     * This is the main task. This has the identical functionality to
     * the previous lbbroker example but uses higher level classes to start child threads
     * to hold the list of workers, and to read and send messages:
     */
public static void main(String[] args) {
    ZContext context = new ZContext();
    //  Prepare our context and sockets
    Socket frontend = context.createSocket(ZMQ.ROUTER);
    Socket backend = context.createSocket(ZMQ.ROUTER);
    frontend.bind("ipc://frontend.ipc");
    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
    Queue<ZFrame> workerQueue = new LinkedList<ZFrame>();
    while (!Thread.currentThread().isInterrupted()) {
        //  Initialize poll set
        Poller items = context.createPoller(2);
        //  Always poll for worker activity on backend
        items.register(backend, Poller.POLLIN);
        //  Poll front-end only if we have available workers
        if (workerQueue.size() > 0)
            items.register(frontend, Poller.POLLIN);
        if (items.poll() < 0)
            //  Interrupted
            break;
        //  Handle worker activity on backend
        if (items.pollin(0)) {
            ZMsg msg = ZMsg.recvMsg(backend);
            if (msg == null)
                //  Interrupted
                break;
            ZFrame identity = msg.unwrap();
            //  Queue worker address for LRU routing
            workerQueue.add(identity);
            //  Forward message to client if it's not a READY
            ZFrame frame = msg.getFirst();
            if (Arrays.equals(frame.getData(), WORKER_READY))
                msg.destroy();
            else
                msg.send(frontend);
        }
        if (items.pollin(1)) {
            //  Get client request, route to first available worker
            ZMsg msg = ZMsg.recvMsg(frontend);
            if (msg != null) {
                msg.wrap(workerQueue.poll());
                msg.send(backend);
            }
        }
    }
    context.destroy();
}
Also used : ZFrame(org.zeromq.ZFrame) ZContext(org.zeromq.ZContext) ZMsg(org.zeromq.ZMsg) Socket(org.zeromq.ZMQ.Socket) LinkedList(java.util.LinkedList) Poller(org.zeromq.ZMQ.Poller)

Example 3 with Poller

use of org.zeromq.ZMQ.Poller in project jeromq by zeromq.

the class lpclient method main.

public static void main(String[] argv) {
    ZContext ctx = new ZContext();
    System.out.println("I: connecting to server");
    Socket client = ctx.createSocket(ZMQ.REQ);
    assert (client != null);
    client.connect(SERVER_ENDPOINT);
    Poller poller = ctx.createPoller(1);
    poller.register(client, Poller.POLLIN);
    int sequence = 0;
    int retriesLeft = REQUEST_RETRIES;
    while (retriesLeft > 0 && !Thread.currentThread().isInterrupted()) {
        //  We send a request, then we work to get a reply
        String request = String.format("%d", ++sequence);
        client.send(request);
        int expect_reply = 1;
        while (expect_reply > 0) {
            //  Poll socket for a reply, with timeout
            int rc = poller.poll(REQUEST_TIMEOUT);
            if (rc == -1)
                //  Interrupted
                break;
            if (poller.pollin(0)) {
                //  We got a reply from the server, must match getSequence
                String reply = client.recvStr();
                if (reply == null)
                    //  Interrupted
                    break;
                if (Integer.parseInt(reply) == sequence) {
                    System.out.printf("I: server replied OK (%s)\n", reply);
                    retriesLeft = REQUEST_RETRIES;
                    expect_reply = 0;
                } else
                    System.out.printf("E: malformed reply from server: %s\n", reply);
            } else if (--retriesLeft == 0) {
                System.out.println("E: server seems to be offline, abandoning\n");
                break;
            } else {
                System.out.println("W: no response from server, retrying\n");
                //  Old socket is confused; close it and open a new one
                poller.unregister(client);
                ctx.destroySocket(client);
                System.out.println("I: reconnecting to server\n");
                client = ctx.createSocket(ZMQ.REQ);
                client.connect(SERVER_ENDPOINT);
                poller.register(client, Poller.POLLIN);
                //  Send request again, on new socket
                client.send(request);
            }
        }
    }
    ctx.destroy();
}
Also used : ZContext(org.zeromq.ZContext) Socket(org.zeromq.ZMQ.Socket) Poller(org.zeromq.ZMQ.Poller)

Example 4 with Poller

use of org.zeromq.ZMQ.Poller in project jeromq by zeromq.

the class lvcache method main.

public static void main(String[] args) {
    ZContext context = new ZContext();
    Socket frontend = context.createSocket(ZMQ.SUB);
    frontend.bind("tcp://*:5557");
    Socket backend = context.createSocket(ZMQ.XPUB);
    backend.bind("tcp://*:5558");
    //  Subscribe to every single topic from publisher
    frontend.subscribe(ZMQ.SUBSCRIPTION_ALL);
    //  Store last instance of each topic in a cache
    Map<String, String> cache = new HashMap<String, String>();
    Poller poller = context.createPoller(2);
    poller.register(frontend, Poller.POLLIN);
    poller.register(backend, Poller.POLLIN);
    //  if anything:
    while (true) {
        if (poller.poll(1000) == -1)
            //  Interrupted
            break;
        //  Any new topic data we cache and then forward
        if (poller.pollin(0)) {
            String topic = frontend.recvStr();
            String current = frontend.recvStr();
            if (topic == null)
                break;
            cache.put(topic, current);
            backend.sendMore(topic);
            backend.send(current);
        }
        //  When we get a new subscription, we pull data from the cache:
        if (poller.pollin(1)) {
            ZFrame frame = ZFrame.recvFrame(backend);
            if (frame == null)
                break;
            //  Event is one byte 0=unsub or 1=sub, followed by topic
            byte[] event = frame.getData();
            if (event[0] == 1) {
                String topic = new String(event, 1, event.length - 1, ZMQ.CHARSET);
                System.out.printf("Sending cached topic %s\n", topic);
                String previous = cache.get(topic);
                if (previous != null) {
                    backend.sendMore(topic);
                    backend.send(previous);
                }
            }
            frame.destroy();
        }
    }
    context.destroy();
}
Also used : ZFrame(org.zeromq.ZFrame) HashMap(java.util.HashMap) ZContext(org.zeromq.ZContext) Socket(org.zeromq.ZMQ.Socket) Poller(org.zeromq.ZMQ.Poller)

Example 5 with Poller

use of org.zeromq.ZMQ.Poller in project jeromq by zeromq.

the class flclient2 method request.

private ZMsg request(ZMsg request) {
    //  Prefix request with getSequence number and empty envelope
    String sequenceText = String.format("%d", ++sequence);
    request.push(sequenceText);
    request.push("");
    //  Blast the request to all connected servers
    int server;
    for (server = 0; server < servers; server++) {
        ZMsg msg = request.duplicate();
        msg.send(socket);
    }
    //  Wait for a matching reply to arrive from anywhere
    //  Since we can poll several times, calculate each one
    ZMsg reply = null;
    long endtime = System.currentTimeMillis() + GLOBAL_TIMEOUT;
    Poller poller = ctx.createPoller(1);
    poller.register(socket, Poller.POLLIN);
    while (System.currentTimeMillis() < endtime) {
        poller.poll(endtime - System.currentTimeMillis());
        if (poller.pollin(0)) {
            //  Reply is [empty][getSequence][OK]
            reply = ZMsg.recvMsg(socket);
            assert (reply.size() == 3);
            reply.pop();
            String sequenceStr = reply.popString();
            int sequenceNbr = Integer.parseInt(sequenceStr);
            if (sequenceNbr == sequence)
                break;
            reply.destroy();
        }
    }
    request.destroy();
    return reply;
}
Also used : ZMsg(org.zeromq.ZMsg) Poller(org.zeromq.ZMQ.Poller)

Aggregations

Poller (org.zeromq.ZMQ.Poller)22 Socket (org.zeromq.ZMQ.Socket)20 ZContext (org.zeromq.ZContext)17 ZMsg (org.zeromq.ZMsg)10 Random (java.util.Random)7 ZFrame (org.zeromq.ZFrame)7 ArrayList (java.util.ArrayList)4 IOException (java.io.IOException)2 ByteBuffer (java.nio.ByteBuffer)2 HashMap (java.util.HashMap)2 LinkedList (java.util.LinkedList)2 Entry (java.util.Map.Entry)2 Context (org.zeromq.ZMQ.Context)2 BufferedWriter (java.io.BufferedWriter)1 File (java.io.File)1 FileNotFoundException (java.io.FileNotFoundException)1 FileWriter (java.io.FileWriter)1 RandomAccessFile (java.io.RandomAccessFile)1