Jetty 如何控制码头中的块?

Jetty 如何控制码头中的块?,jetty,embedded-jetty,chunked-encoding,http-streaming,Jetty,Embedded Jetty,Chunked Encoding,Http Streaming,我正在编写HTTP Web服务,这可能需要相当长的时间才能产生结果。我使用嵌入式Jetty 8.1.5和JAX-RS(Apache CXF) 我决定使用某种控制协议:当新请求出现时,我在一个单独的线程中启动一个长时间运行的作业,并定期以当前状态写入HttpOutputStream行(“控制消息:42%完成”) 问题是Jetty在这里使用块编码,所以我的状态消息是缓冲的,没有用处,因为它们都可以缓冲在单个块中,不会为客户端提供任何进展 我不能使用内容长度属性,因为我不知道最终结果的长度。HttpO

我正在编写HTTP Web服务,这可能需要相当长的时间才能产生结果。我使用嵌入式Jetty 8.1.5和JAX-RS(Apache CXF)

我决定使用某种控制协议:当新请求出现时,我在一个单独的线程中启动一个长时间运行的作业,并定期以当前状态写入HttpOutputStream行(“控制消息:42%完成”)

问题是Jetty在这里使用块编码,所以我的状态消息是缓冲的,没有用处,因为它们都可以缓冲在单个块中,不会为客户端提供任何进展

我不能使用内容长度属性,因为我不知道最终结果的长度。HttpOutputStream.flush()不工作,因为Jetty使用内部缓冲区


在我看来,我需要一种方法来告诉Jetty“请完成当前区块并刷新它”,但不知道如何操作。

您应该能够通过添加一个连接来禁用持久连接本身来禁用区块:关闭响应头,或者提前知道内容长度。或者我想您也可以使用HTTP/1.0。我将用jetty文档打开一个bug,以便更好地记录它。

事实上,我不确定您的问题是块。如果我没弄错的话,您正在将进度写入同一个流中,结果最终会到达哪里

这可以通过对响应调用flushBuffers来完成,也可以不进行分块

但是,这取决于您的连接和浏览器是否进入客户端。 透明代理可以聚合内容,并且在响应完成或其自身缓冲区已满之前不会刷新。在响应完成或缓冲区已满之前,浏览器可能不会对任何内容进行操作

在一些使用这种技术的comet实现中,您必须在推送消息之后发送512字节的空白


您最好使用服务器发送事件、websocket或长轮询之类的方式将进度发送到客户端。。。。。更好的选择-只需使用cometd.org,它将为客户选择最佳的可用传输。

请参阅下面的回复。您的问题不是分块。没错,问题实际上是Apache CXF,它在我们使用的版本中有一个bug,它忽略了flush()调用。