【问题标题】:Spring Web-Flux Server Sent Events is not working when using IP for local and remote calls使用 IP 进行本地和远程调用时,Spring Web-Flux 服务器发送事件不起作用
【发布时间】:2021-02-01 09:22:15
【问题描述】:

我有两个简单的控制器:

@GetMapping(value = "/simple-get")
public String simpleGet() {
    return "simple Get";

}

@GetMapping(path = "/stream-flux", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamFlux() {
    return Flux.interval(Duration.ofSeconds(2))
            .map(sequence -> "Flux - " + LocalTime.now().toString());
}

调用第一个时,它按预期工作(本地和远程使用不同机器的 ip)。但是当调用第二个时,它使用 localhost 可以按预期工作,例如: http://localhost:65465/stream-flux 但是当使用它的 ip 部署到另一台机器时它不能远程工作。我什至检查过,使用 127.0.0.1 时它在本地不起作用,这很奇怪.. 所有不适用于 web-flux 的东西,都可以使用 simple-get API 按预期工作,所以我排除了连接问题。在任何地方都找不到任何关于它的东西。如果对此有任何想法,将不胜感激。

【问题讨论】:

  • 谢谢 Stav,您还记得您在客户端请求中添加了哪些标头吗?
  • 你的日志说什么?
  • 本地(OSX,SB 2.3.4.RELEASE),适用于两者: curl localhost:8080/stream-flux curl 127.0.0.1:8080/stream-flux 你可以添加一些调试(即.doOnXXX)?
  • 感谢 cmets,激活了所有相关组件的调试级别,一切看起来都有效,simple-get 调用和 stream-flux 调用之间没有区别,但经过更多故障排除 - 我有找到了根本原因!我将发布并回答问题.. 感谢您的关注

标签: java spring spring-webflux server-sent-events emitter


【解决方案1】:

感谢所有有兴趣提供帮助的人。经过进一步调查,我们发现了 RC,它实际上与代码/Spring-web-flux 无关。 使用 ip 地址或远程调用它时,请求一直处于挂起状态,直到达到服务器上定义的超时。 在 Windows 机器上使用 netstat -ano |在cmd上findstr 8080 我们能够找到正在使用的端口及其状态。 当使用本地主机时,对 api 的第一次调用会分配一个额外的端口来建立一个连接,该连接将为以后的服务器发送事件保持打开状态,我们可以看到正在侦听该新端口的进程的 PID 是浏览器。 使用 IP 地址时。同样的事情正在发生,但现在正在侦听新端口的进程实际上是防病毒程序。 Sophos 杀毒软件具有 Web 保护功能,它将 SSE 视为恶意下载线程,因此它等待 http 响应到达以便对其进行扫描,在 SSE 中,只要连接打开,它就永远不会到达。

更多细节:

https://community.sophos.com/free-antivirus-tools-for-desktops/f/discussions/5750/sophos-av-blocks-server-sent-events-sse-on-mac-os-x-yosemite

JavaScript EventSource SSE not firing in browser

使用 https 应该可以解决问题。

谢谢

【讨论】:

  • 谢谢。为此损失了 1/2 天——恢复理智!
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 2013-09-08
  • 2014-12-16
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2021-03-01
  • 2012-05-30
相关资源
最近更新 更多