0

激活 Push 时,每当我在应用程序打开的情况下离开选项卡超过一分钟时,我都会收到以下 INFO 级别的日志消息:

16:57:17 INFO  PushHandler - No UI was found based on data in the request, but a slower lookup based on the AtmosphereResource succeeded. See http://dev.vaadin.com/ticket/14251 for more details.

工单 14251 似乎不包含任何与我的场景相关的信息,如下所示:

该应用程序是 Vaadin Spring 应用程序

我的 UI 带有注释

@Push(transport=Transport.WEBSOCKET_XHR)

我正在使用为推送配置的 nginx 服务器,如下所示:

map $http_connection $upgrade_requested {
    default upgrade;
    ''      close;
}

server {
    listen          9002;
    server_name     localhost;
    root            /;

    location / {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host:$server_port;

            proxy_cookie_path ~*^/.* /;
            proxy_pass http://127.0.0.1:9003/;
            proxy_redirect off;
    }

    location /vaadinServlet/PUSH {
            proxy_pass http://127.0.0.1:9003;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $upgrade_requested;
    }

当我只是打开一些选项卡时会出现此日志消息。实际上没有发生任何推送(至少没有由我的应用程序逻辑触发)。这发生在我测试过的所有浏览器中:Firefox、Chrome 和 Safari。除了日志消息,我没有发现任何问题。

我怎样才能摆脱这个日志消息?这可能表明我可能还没有注意到一些问题吗?

4

1 回答 1

2

基于https://blog.martinfjordvald.com/2013/02/websockets-in-nginx/,nginx 中的 websocket 连接使用 proxy_read_timeout 配置选项,默认设置为 60s。这样nginx会在60s后切断ws连接,然后浏览器会建立一个新的ws连接。发生这种情况时,重新建立连接的请求应该包含一个“v-uiId=”参数,并且基于此,服务器应该找到相关的 UI,一切都应该继续工作。

您的错误消息表明 v-uiId 参数存在问题,并且由于某种原因服务器无法找到正确的 UI 实例。然后服务器回退到另一种查找机制,该机制遍历 UI 实例并尝试找到正确的实例。这个成功了,一切都在继续工作。

此外,您的服务器也有可能配置了 60 秒的 websocket 超时。在这种情况下,无论是 nginx 还是服务器都会先断开连接。有时会发生奇怪的事情,这取决于事件的顺序。

如果您什么都不做,您将面临 nginx 切断连接以及服务器在此之后立即执行推送操作的潜在问题。如果服务器没有意识到连接已被切断(由于 TCP 的工作方式),那么它可能会将下一条消息推送到 void 中。

尝试在 nginx 和/或您的服务器中删除/更改超时。

根据经验,如果连接关闭发生在服务器上,那么 Vaadin 将立即知道没有活动连接并推迟推送。如果中间某个地方的某个人在不告诉服务器的情况下切断了连接,那么事情可能会出错。

于 2016-08-17T18:48:57.727 回答