在 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()
.
一些背景知识: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()
.