【发布时间】:2015-06-29 08:56:08
【问题描述】:
我一直在尝试让 json 流在球衣 2 中工作。在我的一生中,在流完成之前没有任何流。
我已经尝试过这个示例,试图模拟一个缓慢的数据生产者。
@Path("/foo")
@GET
public void getAsyncStream(@Suspended AsyncResponse response) {
StreamingOutput streamingOutput = output -> {
JsonGenerator jg = new ObjectMapper().getFactory().createGenerator(output, JsonEncoding.UTF8);
jg.writeStartArray();
for (int i = 0; i < 100; i++) {
jg.writeObject(i);
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
logger.error(e, "Error");
}
}
jg.writeEndArray();
jg.flush();
jg.close();
};
response.resume(Response.ok(streamingOutput).build());
}
然而 jersey 只是坐在那里,直到 json 生成器完成返回结果。我正在看结果是通过 charles 代理获得的。
我需要启用某些东西吗?不知道为什么这不会流出
编辑:
这实际上可能有效,只是不是我预期的那样。我不认为流正在实时写入我想要的东西,它更多的是不必缓冲响应并立即将它们写出给客户端。如果我运行一百万个循环并且没有线程睡眠,那么数据确实会以块的形式写出,而无需在内存中缓冲。
【问题讨论】:
-
你是怎么解决这个问题的?
-
@gkiko 接受的答案解决了我的问题。流媒体不是分块。这就是我的困惑。
-
查看我的编辑。如果这是你正在做的事情。将链接中提到的属性设置为小尺寸或 0,将允许流以您期望的方式工作。
标签: java json jetty jersey-2.0 dropwizard