JsonParser nextToken()挂起并且永不返回

时间:2018-10-18 16:27:09

标签: java json stream streaming inputstream

我正在使用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的后续版本,其中引用了更多的客户代码。

关于如何处理此客户端的任何想法(即在我的应用程序代码中)?我愿意使用其他库。

1 个答案:

答案 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秒。打印结果(如果有的话),或者如果超时后没有结果,则显示超时消息。