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

Wait for server response in Jena custom PropertyFunction

一些背景知识:PropertyFunction 是一个 interface in Jena API,它允许使用 SPARQL 语法执行自定义操作。示例:

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

所以我做了一个 class Launch 来实现这个接口并扩展了一个 class Client。在我的 Launch class 的 exec 方法的主体中,我建立了到服务器的连接,并且在发送信息时没有问题,等待服务器响应是。每当我尝试 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 class 有一个名为 onObjectReceived(Object o, Socket s) 的方法被触发每次从服务器收到东西。我尝试在 exec 方法中使用带有 while 循环的 isDone 变量,并在收到对象后将其设置为 true,但它不起作用。

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