Opendaylight - Почему Future работает в методе init, а не внутри rpc? - PullRequest
0 голосов
/ 18 ноября 2018

Я разрабатываю приложение ODL. Это RPC в моем ян.

rpc device-connection-establishment {
        input {
            list device-list {
                leaf device-id {
                    type string;
                    mandatory true;
                }
                leaf device-ip {
                    type inet:ip-address;
                    mandatory true;
                }
                leaf port {
                    type uint32;
                }
            }
        }

    }

getSession - это функция, написанная мной на Java, которая будет использоваться в rpc.Эта функция содержит в себе будущий объект. doSomethingWith () - это просто функция, в которой я выполняю некоторые операции над предоставленными аргументами.

public void getSession(String deviceName, String ip, int port){
    Config config = doSomethingwith(deviceName,ip,port);
    io.netty.util.concurrent.Future<NetconfClientSession> clientFuture = netconfClientDispatcher.createClient(config);
    NetconfClientSession clientSession = clientFuture.get();
    System.out.println(clientSession);
}

Я пытаюсь использовать функцию getSession при реализации rpc следующим образом:

public java.util.concurrent.Future<RpcResult<DeviceConnectionEstablishmentOutput>> deviceConnectionEstablishment(
            DeviceConnectionEstablishmentInput input) {
                List<DeviceList> devices = input.getDeviceList();
                for (DeviceList device : devices) {
                    String deviceName = device.getDeviceId();
                    IpAddress ip = device.getDeviceIp();
                    long port = input.getPort();
                    getSession(deviceName, ip.getIpv4Address().getValue(), (int) port);
                 }
            return null;
        }

У меня также есть функция init, которая вызывается из проекта автоматически при запуске пакета.

public void init() {
        System.out.println("INIT STARTED");
        getSession("device1", "1.1.1.1", 2022);
    }

Моя проблема в том, что startNeConnect () внутри функции init работает правильно (т.е.) clientFuture.get () возвращает результат будущего. Но тот же самый вызов функции внутри rpc не работает бесполезно. clientFuture.get () ничего не возвращает и продолжает блокировать.

Почему это происходит? Я даже пытался добавить отдельные темы, тайм-ауты. Но это не решается.

UPDATE ::: Два объекта Future, использованные в приведенных выше фрагментах, взяты из разных пакетов. Возвращаемый тип rpc имеет тип java.util.concurrent.Future. Будущее, используемое в getSession, имеет тип io.netty.util.concurrent.Future.

...