Ожидание ответа сервера в пользовательской PropertyFunction Jena - PullRequest
0 голосов
/ 23 мая 2018

Немного фона: PropertyFunction - это интерфейс в Jena API , который позволяет выполнять пользовательские операции с использованием синтаксиса SPARQL.Пример:

select ?result { ?result f:myPropertyFunction 'someObject' . }

Итак, я создал класс Launch, который реализует этот интерфейс и расширяет класс Client.В теле метода exec моего класса Launch я устанавливаю соединение с сервером и, пока отправка информации не представляет проблемы, ожидание ответа сервера.Всякий раз, когда я пытаюсь wait() для ответа сервера, я получаю следующее исключение: java.lang.IllegalMonitorStateException.

Вот тело моего exec метода для справки:

QueryIterator it = null;

try {
    this.connect();    // works well

    this.send(algorithmAndArgs);    // works well

    this.wait();    // exception is thrown

    @SuppressWarnings("unused")
    ResultSet rs = ResultSetFactory.create(it, Arrays.asList(resultIdentifiers));
} catch (Exception e) {
    e.printStackTrace();
}

return it;

Кто-нибудь знаетв чем может быть проблема?Спасибо за ваш ответ.

РЕДАКТИРОВАТЬ 1: Одна вещь, которую я забыл упомянуть, состоит в том, что класс Client имеет метод с именем onObjectReceived(Object o, Socket s), который запускается при каждом получении чего-либос сервера.Я попытался использовать переменную isDone с циклом while в методе exec и установить его в значение true после получения объекта, но это не сработало.

1 Ответ

0 голосов
/ 23 мая 2018

Я решил свою собственную проблему: я создал атрибут private final CountDownLatch objectWasReceivedLatch = new CountDownLatch(1) и в методе exec я делаю boolean objectWasReceived = objectWasReceivedLatch.await(60, TimeUnit.SECONDS);, когда хочу дождаться ответа;в методе onObjectReceived я вызываю objectWasReceivedLatch.countDown().

...