Raven DB 4.1.2 在 Java 中挂起流式查询
Raven DB 4.1.2 hangs on streaming query in Java
我有一个基于 jax-rs 的 REST 服务,我 运行 在 Tomcat 8.5 上在 64 位 Linux 上使用 Java 11;该服务连接到 RavenDB 4.1.2 实例,也在同一台 Linux 机器上。我使用流式查询 return 请求结果。我使用 Postman 提交相同的请求,一切正常:结果是 returned,而且速度相当快。
但是 - 它只能工作 10 次。当我第 11 次提交与之前相同的请求时,results = currentSession.advanced().stream(query);
行挂起并且没有 return。
起初我以为我可能与 StreamingOutput
或 OutputStreamWriter
没有被适当关闭有关。或者可能与 Response
有关 - 但是当我在 Eclipse 中以调试模式单步执行部署代码时,我注意到执行挂在该流线上。
(我发现恰好 10 次是一个特殊的 "human choice" 类型的数字...)
我代码的相关部分:
@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 错误日志也是如此。唯一类似于与此相关的错误消息的是 "Gather debug info":
中显示的内容
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 时也是如此。
它似乎与 Java 11(或 1.8)无关,只是它让我注意到关闭 CloseableIterator<StreamResult<AdministrativeArea>> results;
添加一个简单的 results.close();
一切之后似乎正常工作。如果这个不是解决方案,我会回来更新。
我有一个基于 jax-rs 的 REST 服务,我 运行 在 Tomcat 8.5 上在 64 位 Linux 上使用 Java 11;该服务连接到 RavenDB 4.1.2 实例,也在同一台 Linux 机器上。我使用流式查询 return 请求结果。我使用 Postman 提交相同的请求,一切正常:结果是 returned,而且速度相当快。
但是 - 它只能工作 10 次。当我第 11 次提交与之前相同的请求时,results = currentSession.advanced().stream(query);
行挂起并且没有 return。
起初我以为我可能与 StreamingOutput
或 OutputStreamWriter
没有被适当关闭有关。或者可能与 Response
有关 - 但是当我在 Eclipse 中以调试模式单步执行部署代码时,我注意到执行挂在该流线上。
(我发现恰好 10 次是一个特殊的 "human choice" 类型的数字...)
我代码的相关部分:
@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 错误日志也是如此。唯一类似于与此相关的错误消息的是 "Gather debug info":
中显示的内容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 时也是如此。
它似乎与 Java 11(或 1.8)无关,只是它让我注意到关闭 CloseableIterator<StreamResult<AdministrativeArea>> results;
添加一个简单的 results.close();
一切之后似乎正常工作。如果这个不是解决方案,我会回来更新。