org.zeromq.ZMQException: Errno 48: адрес уже используется - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь реализовать пример pub-sub с использованием ZeroMQ.Я запускаю код издателя в док-контейнере, а код подписчика - в другом.

Мой подписчик:

private ZMQ.Context context;

{
    context = ZMQ.context(1);
}

public void receive() {
    System.out.println("Getting subscriber, listening to tcp://localhost:5565");
    getSubscriber();
    byte[] raw;
    System.out.println("Watching for new Event messages...");
    try {
        while (!Thread.currentThread().isInterrupted()) {
            raw = subscriber.recv();
            System.out.println("Event received " + raw);
        }
    } catch (Exception e) {
        System.out.println("Unable to receive messages via ZMQ: " + e.getMessage());
    }
    if (subscriber != null)
        subscriber.close();
    subscriber = null;
    System.out.println("Attempting restart of Event message watch.");
    receive();
}

private ZMQ.Socket getSubscriber() {
    if (subscriber == null) {
        try {
            subscriber = context.socket(ZMQ.SUB);
            subscriber.connect("tcp://localhost:5565");
            subscriber.subscribe("".getBytes());
        } catch (Exception e) {
            System.out.println("Unable to get a ZMQ subscriber.  Error:  " + e);
            subscriber = null;
        }
    }
    return subscriber;
}

А мой издатель:

private ZMQ.Context context;

{
    context = ZMQ.context(1);
}

public synchronized void sendEventMessage(Event event) {
    try {
        if (publisher == null) {
            getPublisher();
        }
        if (publisher != null) {
            publisher.send(event);
        } 
    } catch (Exception e) {
        System.out.println("Unable to send message via ZMQ");
    }
}

private void getPublisher() {
    try {
        if (publisher == null) {
            publisher = context.socket(ZMQ.PUB);
            publisher.bind("tcp://192.168.32.9:5565");   //where 192.168.32.9 is the IP of the subscriber's docker container
            Thread.sleep(PUB_UP_SLEEP); // allow subscribers to connect
        }
    } catch (Exception e) {
        System.out.println("Unable to get a publisher. Error:  " + e);
        publisher = null;
    }
}

Когда я запускаю приложение, я регистрирую подписчика, и журналы:

[2018-12-10 08:01:02.138] boot - 1  INFO [main] --- ZeroMQEventSubscriber: Getting subscriber, listening to tcp://localhost:5565
[2018-12-10 08:01:02.249] boot - 1  INFO [main] --- ZeroMQEventSubscriber: Watching for new Event messages...

Моя проблема заключается в том, что когда я вызываю sendEventMessage, подписчик ничего не получает и на издателе я получаю эту ошибку:

[2018-12-10 08:54:16.388] boot - 1 ERROR [task-scheduler-5] --- ZeroMQEventPublisherImpl: Unable to get a publisher.  Error:  org.zeromq.ZMQException: Errno 48 : Address already in use

Есть идеи, почему я не могу привязать адрес, к которому подключился абонент?

...