gpt4 book ai didi

java - 使用分块编码时的 CXF 缓冲数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:51 24 4
gpt4 key购买 nike

我使用 Apache CXF 2.5.1 编写了一个 java REST(流)servlet,并将其部署到 Tomcat 7.0.42 容器。 REST 端点本质上是 StreamingOutput 的实现。 ,用 Response 包裹起来 当客户端请求时传递给容器的对象。

该服务的本质是将传感器数据流返回给客户端。该流理论上可以无限长,因为它仅在客户端断开连接时终止。当传感器生成的数据数量很少时,就会出现问题。

该服务“有效”,但当涉及到客户端收到的数据响应的大小时,我遇到了一个问题。客户端仅在服务突破 8192 字节阈值后才接收数据。然后客户端收到800字节,然后是8192字节,然后是800字节...

我希望一旦我在 OutputStream 上调用 flush 就将数据发送到客户端,容器将其交给我的 StreamingOutput 实现。但是,我给出的 OutputStream 的实现(在 org.apache.cxf.transport.http.AbstractHTTPDestination 中定义的 WrappedOutputStream)有一个不执行任何操作的 flush 方法。

有什么方法可以更好地控制 CXF 使用的 OutputStream,以便我可以按需“刷新”到客户端?

最佳答案

最终,我能够按需刷新缓冲区的方法是创建一个 CXF 过滤器,特别是 ResponseHandler 的实现。 .

在过滤器中,我抓取了 HttpServletResponse以及 CXF 使用的 OutputStream 实现(不会让我刷新的那个)来自 Message 实现,将它们包装在 FilteredOutputStream 中。每当调用 flush 时,我都会在 HttpServletResponse 上显式调用 flush。

这是特定于 CXF 的,这样做会产生更多的开销,具体取决于调用刷新的频率,但它确实允许“慢”流更快地到达客户端。

请评论我可能需要关注的任何陷阱或事情。

关于java - 使用分块编码时的 CXF 缓冲数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20667538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com