我正在使用HttpClient :: GET监听事件流。 HttpResponse作为InputStream返回,由于它具有要写入的数据,因此被调用的服务器写入HttpResponse,但是服务器实际上从未关闭该流。
我的代码使用此InputStream创建一个JsonParser并处理传入的数据。但是,由于此流从不关闭,因此到达逻辑端时它将挂在nextToken()上:
while (keepListening()) {
if (parser.nextToken() == null) {
return;
}
treeNode = parser.readValueAsTree();
LOGGER.trace("treeNode: {}", treeNode);
isRequestEnd(treeNode).map(this::reportCoreMsUsed)
.map(report -> writeReport(csvPrinter, report, this.reportsWritten % 1000.0 == 0.0));
}
这将导致线程挂起,停留在等待nextToken()返回某事的情况,这是永远不会发生的。它不会被打断,而且我不确定如何杀死它。如果我可以将超时传递给nextToken()调用,那就太好了,但是由于我不能让我的应用程序无限期地运行。
这个问题是Using Java 11 HttpClient to read chunked data的后续版本,其中引用了更多的客户代码。
关于如何处理此客户端的任何想法(即在我的应用程序代码中)?我愿意使用其他库。
答案 0 :(得分:0)
也许不是最好的解决方案,但是 CompletableFuture可以解决问题:
while (true) {
try {
CompletableFuture<String> future = new CompletableFuture<>();
Executors.newCachedThreadPool().submit(() -> future.complete(slowFunction()));
System.out.println(future.get(3, TimeUnit.SECONDS));
} catch(TimeoutException e) {
System.out.println("no result this time");
}
}
在这里,任何慢速功能最多要等待3秒。打印结果(如果有的话),或者如果超时后没有结果,则显示超时消息。