o.atmosphere.cpr.AsynchronousProcessor : Failed to cancel resource: <UUID>

There is this exception in logs from time to time using Vaadin 25 with Spring-boot 4:

[nio-8080-exec-8] o.atmosphere.cpr.AsynchronousProcessor   : Failed to cancel resource: ddf5b314-760d-4bfe-a28f-45183b8d5b7d

java.lang.IllegalStateException: Message will not be sent because the WebSocket session has been closed
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:458) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(WsRemoteEndpointImplBase.java:415) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$TextMessageSendHandler.write(WsRemoteEndpointImplBase.java:829) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendStringByCompletion(WsRemoteEndpointImplBase.java:216) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.WsRemoteEndpointAsync.sendText(WsRemoteEndpointAsync.java:46) ~[tomcat-websocket.jar:11.0.22]
        at org.atmosphere.container.version.JSR356WebSocket.write(JSR356WebSocket.java:73) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.atmosphere.websocket.WebSocket.write(WebSocket.java:261) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.atmosphere.websocket.WebSocket.write(WebSocket.java:227) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.atmosphere.websocket.WebSocket.write(WebSocket.java:48) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.atmosphere.cpr.AtmosphereResponseImpl$Stream.write(AtmosphereResponseImpl.java:955) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.atmosphere.handler.AbstractReflectorAtmosphereHandler.onStateChange(AbstractReflectorAtmosphereHandler.java:154) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at com.vaadin.flow.server.communication.PushAtmosphereHandler.onStateChange(PushAtmosphereHandler.java:54) ~[flow-server-25.1.10.jar:25.1.10]
        at org.atmosphere.cpr.AsynchronousProcessor.invokeAtmosphereHandler(AsynchronousProcessor.java:538) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.atmosphere.cpr.AsynchronousProcessor.completeLifecycle(AsynchronousProcessor.java:480) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.atmosphere.cpr.AsynchronousProcessor.endRequest(AsynchronousProcessor.java:584) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.atmosphere.websocket.DefaultWebSocketProcessor.executeClose(DefaultWebSocketProcessor.java:689) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.atmosphere.websocket.DefaultWebSocketProcessor.close(DefaultWebSocketProcessor.java:635) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.atmosphere.container.JSR356Endpoint.onClose(JSR356Endpoint.java:318) ~[atmosphere-runtime-3.0.5.slf4jvaadin1.jar:3.0.5.slf4jvaadin1]
        at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:718) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:626) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.WsFrameBase.processDataControl(WsFrameBase.java:349) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:281) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:129) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:85) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:184) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:164) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:152) ~[tomcat-websocket.jar:11.0.22]
        at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:60) ~[tomcat-coyote.jar:11.0.22]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57) ~[tomcat-coyote.jar:11.0.22]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1272) ~[tomcat-coyote.jar:11.0.22]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1801) ~[tomcat-coyote.jar:11.0.22]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-coyote.jar:11.0.22]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946) ~[tomcat-util.jar:11.0.22]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480) ~[tomcat-util.jar:11.0.22]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57) ~[tomcat-util.jar:11.0.22]
        at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]

I would like to ask others if they ever encountered this exception, what might be the cause of this and if there is anything I can do to increase quality of my application to prevent this exception from rising?

I am building Vaadin 25.1.7 application with Spring-boot 4.0.7 deployed as .war file behind an nginx reverse proxy 1.30.2 with push mode being WEBSOCKETS_XHR, using HTTP 1.1 with tomcat 11. Nginx is configured properly for vaadin websocket connections by official docs.

Altough there are no user reported problems and it seems harmless, I still would like to fix it :) Thanks.

My first guess is to check proxy timeout of the websocket connection. If the proxy kills the connection too early you will get this error.

These are my timeouts in nginx proxy:

    keepalive_requests 240;
    send_timeout 2400s;
    proxy_connect_timeout 60s;
    proxy_send_timeout 600s;
    proxy_read_timeout 600s;
    keepalive_timeout 240s;
    proxy_store off;
    proxy_buffering off;

Default vaadin websocket timeout is 60s by docs: How to configure reverse proxy for Vaadin applications.

I have one demo docker cluster with nginx, and I have somewhat different settings, your proxy_connect_timeout might be too short. I.e. it might need some grace.

I have increased my proxy_connect_timeout, lets see if i see it in logs again.

I have not found original exception message and type again, however, there is another exception occuring several times during application runtime:

java.io.IOException: The response may not be written to once it has been closed
        at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:360)
        at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:341)
        at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:99)
        at com.vaadin.flow.server.communication.TransferUtil.transfer(TransferUtil.java:103)
        at com.vaadin.flow.server.streams.InputStreamDownloadHandler.handleDownloadRequest(InputStreamDownloadHandler.java:102)
        at com.vaadin.flow.server.streams.DownloadHandler$1.handleDownloadRequest(DownloadHandler.java:139)
        at com.vaadin.flow.server.streams.DownloadHandler.handleRequest(DownloadHandler.java:103)
        at com.vaadin.flow.server.communication.StreamRequestHandler.callElementResourceHandler(StreamRequestHandler.java:194)
        at com.vaadin.flow.server.communication.StreamRequestHandler.handleRequest(StreamRequestHandler.java:119)
        at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1835)
        at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:402)
        at com.vaadin.flow.spring.SpringServlet.service(SpringServlet.java:106)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:513)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:333)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:262)
        at org.springframework.web.servlet.mvc.ServletForwardingController.handleRequestInternal(ServletForwardingController.java:139)
        at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177)
        at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:49)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1000)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:782)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1272)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1801)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)
        at java.base/java.lang.Thread.run(Unknown Source)

Might the proxy_connect_timeout of 130s be too high in some scenarios? I mean, I know there is not much I can do about this kind of messages, even with precise tweaking and configuration there could be some timeouts in some cases.