Unexpected message id from the client

Hello,

I got “Unexpected message id from the client” error in my logs. Stack trace pasted below. My environment is Vaadin 16 on Spring Boot 2.2.x. It is running on a kubernetes cluster in Digital Ocean (DO) public cloud. It is using a load balancer from DO with sticky session, in case it matters. But I only have one instance of the front-end running. This is a production env. The error does not happen often. In fact it only shows up once in the logs, and thye have been up for 5 days. The clients are tablets that are being used as kiosks. I heavily rely on WebSockets (@Push) to keep the tablet’s screen updated with recent data. The complain i got from the user was that the screen stopped updating with new information. I had to have the user refresh the page.

Any idea what could have caused this? And is there something I can do to work around this should it happen again? I rely on the sessions that contain an object that I refresh the screen with once new data arrives.

21:23:10.377 - [nio-8080-exec-6]
 n.h.c.f.AccessLogFilter   : Starting -- https://intelligenthost.net/?v-r=uidl&v-uiId=98
21:23:10.379 - [nio-8080-exec-6]
 v.f.s.DefaultErrorHandler :
                                                                                                                                                                                                                                                                                                                                              java.lang.UnsupportedOperationException: Unexpected message id from the client. Expected sync id: 157, got 155. Message start: {"csrfToken":"41c6125e-ed16-4469-8031-d679d12e3e6d","rpc":[{"type":"event","node":5181,"event":"click","data":{"event.shiftKey":false,"event.metaKey":false,"event.detail":1,"event.ctrlKey":false,"event.clientX":458,"event.clientY":234,"event.altKey":false,"event.button":0,"event.screenY":233,"event.screenX":458}}]
,"syncId":231,"clientId":155}                                                                                                                                at com.vaadin.flow.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:307)
        at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:114)
        at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
        at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1539)
        at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:238)
        at com.vaadin.flow.spring.SpringServlet.service(SpringServlet.java:117)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:352)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
        at org.springframework.web.servlet.mvc.ServletForwardingController.handleRequestInternal(ServletForwardingController.java:141)
        at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177)
        at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:52)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at brave.servlet.TracingFilter.doFilter(TracingFilter.java:65)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at net.hikati.common.filters.AccessLogFilter.doFilterInternal(AccessLogFilter.java:119)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)                                                                                                 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)                                                                                                         at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)                                                                                                      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)                                                                                                       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)                                                                                                 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter.doFilter(ExceptionLoggingFilter.java:50)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)                                                                                                 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at brave.servlet.TracingFilter.doFilter(TracingFilter.java:82)
        at org.springframework.cloud.sleuth.instrument.web.TraceWebServletAutoConfiguration$LazyTracingFilter.doFilter(TraceWebServletAutoConfiguration.java:143)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:108)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:747)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:834)

21:23:10.380 - [nio-8080-exec-6]
 n.h.c.f.AccessLogFilter   : Finished -- POST https://intelligenthost.net/?v-r=uidl&v-uiId=98 200 3ms
21:23:12.566 - [nio-8080-exec-7]
 n.h.c.f.AccessLogFilter   : Starting -- https://intelligenthost.net/?v-r=uidl&v-uiId=98
21:23:12.567 - [nio-8080-exec-7]
 n.h.c.f.AccessLogFilter   : Finished -- POST https://intelligenthost.net/?v-r=uidl&v-uiId=98 200 1ms
21:23:14.298 - [nio-8080-exec-2]
 n.h.c.f.AccessLogFilter   : Starting -- https://intelligenthost.net/vaadinServlet/?v-r=push&v-uiId=98&v-pushId=d77ad186-7310-4968-936c-1f595b541ac2&X-Atmosphere-tracking-id=4661e526-4bde-40b9-b24f-e79e0a710ee6&X-Atmosphere-Framework=2.3.2.vaadin1-javascript&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true&Content-Type=application/json;%20charset=UTF-8&X-atmo-protocol=true                                                                                                                                                                     21:23:14.298 - [nio-8080-exec-2]
 n.h.c.f.AccessLogFilter   : Finished -- GET https://intelligenthost.net/vaadinServlet/?v-r=push&v-uiId=98&v-pushId=d77ad186-7310-4968-936c-1f595b541ac2&X-Atmosphere-tracking-id=4661e526-4bde-40b9-b24f-e79e0a710ee6&X-Atmosphere-Framework=2.3.2.vaadin1-javascript&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true&Content-Type=application/json;%20charset=UTF-8&X-atmo-protocol=true 101 1ms
21:23:17.649 - [nio-8080-exec-1]
 n.h.c.f.AccessLogFilter   : Starting -- https://intelligenthost.net/?v-r=uidl&v-uiId=98
21:23:17.650 - [nio-8080-exec-1]
 .v.f.s.c.ServerRpcHandler : Resynchronizing UI by client's request. Under normal operations this should not happen and may indicate a bug in Vaadin platform. If you see this message regularly please open a bug report at https://github.com/vaadin/flow/issues
21:23:17.651 - [nio-8080-exec-1]
 n.h.s.k.m.ManagerView     : detaching
21:23:17.651 - [    Thread-4231]
 n.h.s.u.RefreshViewThread : Got InterruptedException while refreshing a SalonView.

That last error is my code interrupting the refresh thread once it detects that the session is closed.