[ https://issues.apache.org/jira/browse/WICKET-6643?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16793419#comment-16793419 ]
Martin Grigorov edited comment on WICKET-6643 at 3/15/19 7:57 AM: ------------------------------------------------------------------ The problem here is that you try to write to the server at page unload time (from error.js): {code:java} window.onunload = function() { Wicket.WebSocket.send('Bla!'); };{code} The last chance to write to the server is at `beforeunload` event time. At `unload` the browser sends `close` message to the opened WebSocket connections and depending on which packet reaches the server first (the close or the send) it may work or not. I will not suppress the IOException in Wicket because it might help someone realize such kind of an issue in his/her application. was (Author: mgrigorov): The problem here is that you try to write to the server at page unload time (from error.js): {code:java} window.onbeforeunload = function() { Wicket.WebSocket.send('Bla!'); };{code} The last chance to write to the server is at `beforeunload` event time. At `unload` the browser sends `close` message to the opened WebSocket connections and depending on which packet reaches the server first (the close or the send) it may work or not. I will not suppress the IOException in Wicket because it might help someone realize such kind of an issue in his/her application. > exception in web-sockets on tomcat 8 > ------------------------------------ > > Key: WICKET-6643 > URL: https://issues.apache.org/jira/browse/WICKET-6643 > Project: Wicket > Issue Type: Improvement > Affects Versions: 7.12.0 > Environment: tomcat 8 > Reporter: Ernesto Reinaldo Barreiro > Assignee: Martin Grigorov > Priority: Trivial > Attachments: websockets-error.tar.gz > > > In our log files we get following stacktrace > {code} > 09:41:11.673 [http-nio-8080-exec-10] ERROR com.semedy.WebSocketMessage - > Could not send notification java.io.IOException: java.io.IOException: Broken > pipe at > org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:315) > ~[tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:250) > ~[tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:191) > ~[tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37) > ~[tomcat-websocket.jar:8.5.38] at > org.apache.wicket.protocol.ws.javax.JavaxWebSocketConnection.sendMessage(JavaxWebSocketConnection.java:81) > ~[wicket-native-websocket-javax-7.12.0.jar:7.12.0] at > com.semedy.WebSocketMessage.privateSendNotificationTo(WebSocketMessage.java:83) > [classes/:?] at > com.semedy.WebSocketMessage.sendNotificationToAllSessions(WebSocketMessage.java:70) > [classes/:?] at com.semedy.BasePage$1.onMessage(BasePage.java:32) > [classes/:?] at > org.apache.wicket.protocol.ws.api.WebSocketBehavior.onEvent(WebSocketBehavior.java:64) > [wicket-native-websocket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.settings.FrameworkSettings.dispatchEvent(FrameworkSettings.java:147) > [wicket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.ComponentEventSender.dispatchToComponent(ComponentEventSender.java:292) > [wicket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.ComponentEventSender.breadth(ComponentEventSender.java:149) > [wicket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.ComponentEventSender.send(ComponentEventSender.java:68) > [wicket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.Component.send(Component.java:4575) > [wicket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.protocol.ws.api.WebSocketMessageBroadcastHandler$1.run(WebSocketMessageBroadcastHandler.java:74) > [wicket-native-websocket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.protocol.ws.WebSocketSettings$SameThreadExecutor.run(WebSocketSettings.java:362) > [wicket-native-websocket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.protocol.ws.api.WebSocketMessageBroadcastHandler.respond(WebSocketMessageBroadcastHandler.java:97) > [wicket-native-websocket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:895) > [wicket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) > [wicket-request-7.12.0.jar:7.12.0] at > org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:265) > [wicket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:222) > [wicket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:293) > [wicket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor.broadcastMessage(AbstractWebSocketProcessor.java:263) > [wicket-native-websocket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.protocol.ws.api.AbstractWebSocketProcessor.onMessage(AbstractWebSocketProcessor.java:148) > [wicket-native-websocket-core-7.12.0.jar:7.12.0] at > org.apache.wicket.protocol.ws.javax.JavaxWebSocketProcessor$StringMessageHandler.onMessage(JavaxWebSocketProcessor.java:65) > [wicket-native-websocket-javax-7.12.0.jar:7.12.0] at > org.apache.wicket.protocol.ws.javax.JavaxWebSocketProcessor$StringMessageHandler.onMessage(JavaxWebSocketProcessor.java:60) > [wicket-native-websocket-javax-7.12.0.jar:7.12.0] at > org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:394) > [tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:119) > [tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:495) > [tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:294) > [tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133) > [tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82) > [tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171) > [tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151) > [tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148) > [tomcat-websocket.jar:8.5.38] at > org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54) > [tomcat-coyote.jar:8.5.38] at > org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53) > [tomcat-coyote.jar:8.5.38] at > org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806) > [tomcat-coyote.jar:8.5.38] at > org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) > [tomcat-coyote.jar:8.5.38] at > org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) > [tomcat-coyote.jar:8.5.38] at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) > [?:1.8.0_201] at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) > [?:1.8.0_201] at > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > [tomcat-util.jar:8.5.38] at java.lang.Thread.run(Thread.java:748) > [?:1.8.0_201] Caused by: java.io.IOException: Broken pipe at > sun.nio.ch.FileDispatcherImpl.write0(Native Method) ~[?:1.8.0_201] at > sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[?:1.8.0_201] at > sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[?:1.8.0_201] at > sun.nio.ch.IOUtil.write(IOUtil.java:65) ~[?:1.8.0_201] at > sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) ~[?:1.8.0_201] > at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:134) > ~[tomcat-coyote.jar:8.5.38] at > org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) > ~[tomcat-coyote.jar:8.5.38] at > org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:157) > ~[tomcat-coyote.jar:8.5.38] at > org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1306) > ~[tomcat-coyote.jar:8.5.38] at > org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:726) > ~[tomcat-coyote.jar:8.5.38] at > org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:679) > ~[tomcat-coyote.jar:8.5.38] at > org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:669) > ~[tomcat-coyote.jar:8.5.38] at > org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:96) > ~[tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:494) > ~[tomcat-websocket.jar:8.5.38] at > org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:309) > ~[tomcat-websocket.jar:8.5.38] ... 43 more > {code} > > I don't know if it is really a wicket error or tomcat (or how we are using > this in our application). It seems to have no side effect on how we are using > websockets in our application. But it would be nice to get rid of stack trace > on logs. I managed to reproduce this in quick-start. > To reproduce just reload the home page (maybe more than once). > > This happens with latest tomcat 8.5.38. -- This message was sent by Atlassian JIRA (v7.6.3#76005)