Как zmq позволяет клиентам подписываться / прослушивать до запуска сервера - PullRequest
2 голосов
/ 14 января 2012

Вопрос в названии, но немного уточню. Если я пишу приложение 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);
        }
    }
}

1 Ответ

2 голосов
/ 21 февраля 2012

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

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

...