等待Jena自定义PropertyFunction中的服务器响应

时间:2018-05-23 07:53:43

标签: java server client wait jena

一些背景知识:PropertyFunctioninterface in 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 :(得分:1)

我解决了自己的问题:我创建了一个属性private final CountDownLatch objectWasReceivedLatch = new CountDownLatch(1),当我想等待响应时,在exec方法中我boolean objectWasReceived = objectWasReceivedLatch.await(60, TimeUnit.SECONDS);。我在onObjectReceived方法中调用了objectWasReceivedLatch.countDown()