Raven DB 4.1.2 зависает при потоковом запросе в Java - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть служба REST на основе jax-rs, которую я запускаю на Tomcat 8.5 в 64-битной Linux, используя Java 11;эта служба подключается к экземпляру RavenDB 4.1.2, также на той же машине Linux.Я использую потоковый запрос, чтобы вернуть результат запроса.Я использую Почтальон, чтобы отправить тот же запрос, и все работает хорошо: результаты возвращаются, и довольно быстро.

Однако - это работает только 10 раз.Когда я отправляю тот же запрос, что и в 11-й раз, строка results = currentSession.advanced().stream(query); зависает и не возвращается.Сначала я подумал, что могу иметь какое-то отношение к тому, что StreamingOutput или OutputStreamWriter не закрываются должным образом.или, может быть, что-то делать с Response - но когда я прошел через развернутый код в Eclipse в режиме отладки, я заметил, что выполнение останавливается на этой потоковой линии.(Я нахожу ровно 10 раз своеобразным числом "человеческого выбора" ...)

Соответствующие части моего кода:

@GET
@Path("/abcntr/{ccode}/{st}/{zm}") 
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.TEXT_PLAIN)
public Response retrieveInfo(@PathParam("ccode") String ccode, @PathParam("st") String st, @PathParam("zm") String zm)
{
    (...)
    StreamingOutput adminAreaStream = new StreamingOutput()
    {
        ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();

        @Override
        public void write(OutputStream output) throws IOException, WebApplicationException
        {
            try(IDocumentSession currentSession = ServiceListener.ravenDBStore.openSession())
            {
                Writer writer = new BufferedWriter(new OutputStreamWriter(output));
                (...)
                if(indexToBeQueried.startsWith("Level0"))
                {                                         
                    IDocumentQuery<AdministrativeArea> query = currentSession.query(area.class, Query.index(indexToBeQueried))
                            .whereEquals("i", ccode);
                    results = currentSession.advanced().stream(query); 
                }
                else 
                {
                    IDocumentQuery<AdministrativeArea> query = currentSession.query(area.class, Query.index(indexToBeQueried))
                            .whereEquals("i", ccode)
                            .andAlso()
                            .whereEquals("N1", sName);
                    results = currentSession.advanced().stream(query);  // THIS IS WHERE IT DOESNT COME BACK
                }
                while(results.hasNext())
                {
                    StreamResult<AdministrativeArea> adma = results.next();  
                    adma.getDocument().properties = retrievePropertiesForArea(adma.getDocument(), currentSession);
                    writer.write(ow.writeValueAsString(adma.getDocument()));
                    writer.write(",");
                }

                (...)
                currentSession.advanced().clear();
                currentSession.close();
            }
            catch (Exception e)
            {
                System.out.println("Exception: " + e.getMessage() + e.getStackTrace());
            }
        }
    };

    if(!requestIsValid)
        return Response.status(400).build();
    else
        return Response.ok(adminAreaStream).build();
}

Журналы ошибок RavenDB появляются пустыми, как и журналы ошибок Tomcat.Единственное, что удаленно напоминает сообщение об ошибке, относящееся к этому, - это то, что появляется из «Собрать информацию отладки»:

System.ArgumentNullException: Value cannot be null.
Parameter name: source
   at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
   at Raven.Server.Documents.Handlers.Debugging.QueriesDebugHandler.QueriesCacheList() in C:\Builds\RavenDB-Stable-4.1\src\Raven.Server\Documents\Handlers\Debugging\QueriesDebugHandler.cs:line 181
   at Raven.Server.ServerWide.LocalEndpointClient.InvokeAsync(RouteInformation route, Dictionary`2 parameters) in C:\Builds\RavenDB-Stable-4.1\src\Raven.Server\ServerWide\LocalEndpointClient.cs:line 61
   at Raven.Server.ServerWide.LocalEndpointClient.InvokeAndReadObjectAsync(RouteInformation route, JsonOperationContext context, Dictionary`2 parameters) in C:\Builds\RavenDB-Stable-4.1\src\Raven.Server\ServerWide\LocalEndpointClient.cs:line 91
   at Raven.Server.Documents.Handlers.Debugging.ServerWideDebugInfoPackageHandler.WriteForDatabase(ZipArchive archive, JsonOperationContext jsonOperationContext, LocalEndpointClient localEndpointClient, String databaseName, String path) in C:\Builds\RavenDB-Stable-4.1\src\Raven.Server\Documents\Handlers\Debugging\ServerWideDebugInfoPackageHandler.cs:line 311

Спасибо за любые подсказки по расследованию, которые вы можете дать мне.

ОБНОВЛЕНИЕ: То же самое при переносе компилятора и Tomcat JVM обратно на Java 1.8.

1 Ответ

0 голосов
/ 21 ноября 2018

Похоже, что это не имеет ничего общего с Java 11 (или 1.8), а просто просто ускользнуло от моего внимания, чтобы закрыть CloseableIterator<StreamResult<AdministrativeArea>> results; После добавления простого results.close(); все выглядит так, как должно.Если это не было решением, я вернусь и обновлю.

...