当激活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.
Ticket 14251似乎没有包含我的方案的任何相关信息,如下所示:
该应用程序是Vaadin Spring应用程序
我的用户界面用
注释@Push(transport=Transport.WEBSOCKET_XHR)
我正在使用配置为push的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。 除了日志消息,我没有发现任何问题。
如何摆脱此日志消息? 这或许可能表明我可能还没有注意到的一些问题吗?
答案 0 :(得分:2)
基于https://blog.martinfjordvald.com/2013/02/websockets-in-nginx/,nginx中的websocket连接使用proxy_read_timeout配置选项,默认设置为60秒。因此,nginx将在60秒后切断ws连接,然后浏览器将建立新的ws连接。发生这种情况时,重新建立连接的请求应包含" v-uiId ="参数,基于此,服务器应该找到相关的UI,一切都应该继续工作。
您的错误消息表明v-uiId参数存在问题,并且由于某种原因,服务器无法根据该参数找到正确的UI实例。然后服务器回退到另一个查找机制,它遍历UI实例并尝试找到正确的查找机制。这个成功了,一切都在继续。
此外,您的服务器还可能配置了60秒的websocket超时。在这种情况下,nginx或服务器将首先切断连接。有时会发生奇怪的事情,具体取决于事件的顺序。
如果你什么都不做,你将会遇到nginx切断连接和服务器在此之后执行推送操作的潜在问题。如果服务器没有意识到连接已被切断(由于TCP的工作方式),那么它可能会将下一条消息推送到虚空中。
尝试删除/更改nginx和/或服务器中的超时。
根据经验,如果服务器上发生连接关闭,那么Vaadin会立即知道没有活动连接并且会推迟推送。如果中间的某个人在不告诉服务器的情况下切断了连接,那么事情可能会出错。