ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – 为什么我的服务器发送作为批处理的事件?

2019-09-10 18:02:48  阅读:186  来源: 互联网

标签:server-sent-events javascript java spring


我有一个基于Java 8 / Spring4的Web应用程序,它使用服务器发送事件(SSE)向运行一些Javascript并更新进度条的基于浏览器的客户端报告长时间运行的进程的进度.在我的开发环境和开发服务器上,SSE几乎实时到达客户端.我可以看到他们使用Chrome开发工具到达(连同他们的时间戳)并且进度条平滑更新.

但是,当我部署到我们的生产环境时,我会观察到不同的行为.在长时间运行的进程完成之前,事件不会到达浏览器.然后它们全部到达(根据开发工具,这些事件的时间戳都在几百毫秒之内).进度条在持续时间内停留在0%,然后非常快速地跳到100%.同时,我的服务器日志告诉我事件是定期生成和发送的.

这是相关的服务器端代码:

public class LongRunningProcess extends Thread {
    private SseEmitter emitter;
    public LongRunningProcess(SseEmitter emitter) {
        this.emitter = emitter;
    }
    public void run() {
        ...
        // Sample event, representing 10% progress
        SseEventBuilder event = SseEmitter.event();
        event.name("progress");
        event.data("{ \"progress\": 10 }"); // Hand-coded JSON
        emitter.send(event);
        ...
    }
}

@RestController
public class UploadController {
    @GetMapping("/start")
    public SseEmitter start() {
        SseEmitter emitter = new SseEmitter();
        LongRunningProcess process = new LongRunningProcess(emitter);
        process.start();
        return emitter;
    }
}

这是相关的客户端Javascript:

EventSource src = new EventSource("https://www.example.com/app/start");
src.addEventListener('progress', function(event) {
    // Process event.data and update progress bar accordingly
});

我相信我的代码是相当典型的,它在DEV中运行得很好.但是,如果有人能看到问题,请告诉我.

该问题可能与我们的生产服务器的配置有关. DEV和PROD都运行相同版本的Tomcat.但是,其中一些是通过负载平衡器(F5 in out case)访问的.几乎所有人都支持CDN(在我们的案例中是Akamai).这个设置的某些部分是否会导致SSE被缓冲(或排队或缓存),这可能会产生我所看到的内容?

按照基础架构配置的想法,我在响应头中观察到以下内容.在开发环境中,我的浏览器收到:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: Keep-Alive
Content-Type: text/event-stream;charset=UTF-8
Keep-Alive: timeout=15, max=99
Pragma: no-cache
Server: Apache
Transfer-Encoding: chunked
Via: 1.1 example.com

这是我对事件流的期望.未知内容长度的分块响应.在生产环境中,我的浏览器会收到不同的内容:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: keep-alive
Content-Type: text/event-stream;charset=UTF-8
Content-Encoding: gzip
Content-Length: 318
Pragma: no-cache
Vary: Accept-Encoding

这里返回的内容具有已知长度并被压缩.我不认为这应该发生在事件流中.似乎有些东西正在将我的事件流转换为单个文件.关于如何弄清楚这是做什么的任何想法?

解决方法:

你尝试过其他浏览器吗?我正在尝试调试类似的问题,其中SSE在iPhone客户端上运行但在MacOS / Safari或Firefox上运行.

您的问题可能有一个解决方法 – 如果服务器发送“Connection:close”而不是keep-alive,或者甚至关闭连接本身,客户端应该在几秒钟内重新连接,服务器将发送当前进度条事件.

我猜测关闭连接将刷新导致问题的缓冲区.

标签:server-sent-events,javascript,java,spring
来源: https://codeday.me/bug/20190910/1800398.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有