как zmq позволяет клиентам подписываться/слушать до запуска сервера

Вопрос в заголовке, но немного уточню. Если я пишу приложение NIO на Java, используя API-интерфейсы Sun/Oracle NIO или такую ​​​​инфраструктуру, как Netty, возможно ли, чтобы клиент «подключался» в качестве подписчика, даже если сервер не привязан к хосту/порту, к которому он подключается к? Что я действительно хочу сделать, так это просто не заботиться о том, мертв ли ​​сервер, но как только он находится в сети и отправляет сообщение, я получаю его, как если бы он был там все время. Возьмите этот сервер и клиент ZMQ, например.

Сначала запускаем клиент....


import org.zeromq.ZMQ;

import java.util.Date;

public class ZMQClient {

    public static void main(String[] args) {
        // Prepare our context and subscriber
        ZMQ.Context context = ZMQ.context(1);
        ZMQ.Socket subscriber = context.socket(ZMQ.SUB);

        subscriber.connect("tcp://localhost:5563");
        subscriber.subscribe("".getBytes());
        while (true) {
            // Read envelope with address
            String address = new String(subscriber.recv(0));
            // Read message contents
            String contents = new String(subscriber.recv(0));
            System.out.println(address + " : " + contents+" - "+ new Date());
        }
    }
}

...и через некоторое время сервер


import org.zeromq.ZMQ;

import java.util.Date;

public class ZMQServer {

    public static void main(String[] args) throws Exception{
        // Prepare our context and publisher
        ZMQ.Context context = ZMQ.context(1);
        ZMQ.Socket publisher = context.socket(ZMQ.PUB);

        publisher.bind("tcp://127.0.0.1:5563");
        while (true) {
            // Write two messages, each with an envelope and content
            publisher.send("".getBytes(), ZMQ.SNDMORE);
            publisher.send("We don't want to see this".getBytes(), 0);
            publisher.send("".getBytes(), ZMQ.SNDMORE);
            publisher.send("We would like to see this".getBytes(), 0);
            System.out.println("Sent @ "+new Date());
            Thread.sleep(1000);
        }
    }
}

person zcourts    schedule 13.01.2012    source источник


Ответы (1)


ZMQ поддерживает такое поведение (позволяя клиентам подписываться и т. д. до того, как сервер будет запущен), потому что он порождает отдельный поток для обработки связи через сокеты. Если конечная точка сокета недоступна, поток позаботится о постановке запросов в очередь до тех пор, пока соединение не станет доступным. Все это делается прозрачно для вас.

Так что, конечно, вы, вероятно, могли бы принять эту технику для других API, но вам придется позаботиться обо всей рутинной работе.

person larsks    schedule 21.02.2012