JsonParser nextToken () зависает и никогда не возвращается - PullRequest
0 голосов
/ 18 октября 2018

Я слушаю поток событий, используя HttpClient :: GET.HttpResponse возвращается как InputStream, который записывается вызываемым сервером, поскольку у него есть данные для записи, но сервер никогда фактически не закрывает поток.

Мой код создает JsonParser с использованием этого InputStream и обрабатывает данныепо мере поступления. Однако, поскольку этот поток никогда не закрывается, он зависает в 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 (), но так как я не могу, мое приложение работает бесконечно.

Этот вопрос является продолжением Использование Java 11HttpClient для чтения фрагментированных данных , где указывается больше клиентского кода.

Любые идеи о том, как обрабатывать эту клиентскую часть (т.е. в коде моего приложения)?Я открыт для использования другой библиотеки.

1 Ответ

0 голосов
/ 18 октября 2018

Возможно, не самое удачное решение, но a 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 секунд на любую медленную функцию.Распечатайте результат (если есть) или распечатайте сообщение о превышении времени ожидания, если в течение времени не было результата.

...