在提出问题之前,我会尝试提供一些背景信息。
设置
我有一个apache2(v2.4)服务器通过一个简单的ProxyPass代理请求到我的本地Apache Tomcat(v6)。
Proxy / http://localhost:8080/
服务
我们的服务处理一个文件,当它完成时,将状态发送回客户端。即使对于小文件,我们处理文件的速度也很慢(预期)。因此,一个30kb的请求可能需要5m左右。
目标
为避免因为IDLE而导致连接被丢弃,我们每10秒向客户端发回一个空行。到目前为止,即使使用亚马逊ELB,也是如此的好。
因此,在实现中,我们使用Callable运行任务并每隔10秒轮询一次Future。当轮询超时时,我们会向客户端发送一个空行并强制刷新输出流。
问题
但所有这些东西只有在后端发送第一个'\ n'之前上传文件时才有效。
当我发送大文件(200mb)时,上传需要几分钟,客户端永远不会看到空行,连接完成时会丢失(因为空闲丢弃)。我们测试了这个直接请求Tomcat或ELB-> Tomcat而不是ELB-> Apache-> Tomcat或Apache-> Tomcat,客户端成功接收空白行。