Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用分块编码时CXF缓冲数据_Java_Cxf_Chunked Encoding_Websocket - Fatal编程技术网

Java 使用分块编码时CXF缓冲数据

Java 使用分块编码时CXF缓冲数据,java,cxf,chunked-encoding,websocket,Java,Cxf,Chunked Encoding,Websocket,我已经使用ApacheCXF2.5.1编写了一个JavaREST(流)servlet,并将其部署到Tomcat7.0.42容器中。REST端点本质上是一个实现,它是一个对象,当客户端请求时,该对象被传递给容器 该服务的本质是将传感器数据流返回给客户端。这个流理论上可以无限长,因为它只有在客户端断开连接时才会终止。当传感器生成的数据量很小时,就会出现问题 该服务“有效”,但当涉及到客户端接收的数据响应的大小时,我遇到了一个问题。客户端仅在服务打破8192字节阈值后接收数据。然后客户端接收800字节

我已经使用ApacheCXF2.5.1编写了一个JavaREST(流)servlet,并将其部署到Tomcat7.0.42容器中。REST端点本质上是一个实现,它是一个对象,当客户端请求时,该对象被传递给容器

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

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

我希望在我调用OutputStream上的flush时,数据被发送到客户机,容器将其交给我的StreamingOutput实现。然而,我给出的OutputStream的实现(org.apache.cxf.transport.http.AbstractHTTPDestination中定义的WrappedOutputStream)有一个flush方法,它什么也不做


有没有办法对CXF使用的输出流进行更多控制,以便我可以按需“刷新”到客户端?

有两件事需要检查。首先,您可能需要设置内容长度头(response.setHeader()),其次,您可能需要设置缓冲区大小(response.setBufferSize())。这里似乎有一个讨论:


执行
flush()
后,Tomcat本身应该立即提交响应。这可能是CXF的问题


如果您想要一个建议,我可能会建议您切换到使用这种应用程序:它更适合从服务器到客户端的长期数据流(或者甚至相反)。如果您不喜欢WebSocket,您至少应该看看Servlet 3.0-spec异步I/O,甚至Comet(尽管3.0-async在IMO支持方面是更好的选择,等等)。

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

在筛选器中,我从消息实现中获取了CXF使用的和OutputStream实现(不允许刷新的实现),将它们包装在FilteredOutputStream中。无论何时调用flush,我都在HttpServletResponse上显式调用flush

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


请评论我可能需要关注的任何问题。

合同中没有setHeader和setBufferSize可供回复。我也没有尝试禁用分块。这对我有什么帮助?我非常确定我想要分块,我只想让CXF使用一个OutputStream,它尊重我对flush()的调用。。我不确定你是否可以进行分块,也可以一路强制刷新。很好的发现!您应该创建一个缺陷,并向CXF社区提供补丁,以了解他们的反应。