<div dir="ltr">I can verify that neither onError or onClose is being called however CloseTask is being called.<div><br></div><div>Robin<br><div><br></div><div><br></div><div><pre style="color:rgb(169,183,198);font-size:10.5pt;background-color:rgb(43,43,43)"><font face="monospace, monospace"><span style="color:rgb(204,120,50)">public class </span>WebSocketConnectionHandler <span style="color:rgb(204,120,50)">extends </span>AbstractReceiveListener <span style="color:rgb(204,120,50)">implements </span>WebSocketConnectionCallback {<br><br> <span style="color:rgb(187,181,41)">@Override<br></span><span style="color:rgb(187,181,41)"> </span><span style="color:rgb(204,120,50)">public void </span><span style="color:rgb(255,198,109)">onConnect</span>(WebSocketHttpExchange exchange<span style="color:rgb(204,120,50)">, </span>WebSocketChannel webSocketChannel) {<br> System.<span style="color:rgb(152,118,170);font-style:italic">out</span>.println(<span style="color:rgb(106,135,89)">"onConnect"</span>)<span style="color:rgb(204,120,50)">;</span><span style="color:rgb(204,120,50)"><br></span><span style="color:rgb(204,120,50)"> </span>webSocketChannel.getReceiveSetter().set(<span style="color:rgb(204,120,50)">this</span>)<span style="color:rgb(204,120,50)">;<br></span><span style="color:rgb(204,120,50)"> </span>webSocketChannel.resumeReceives()<span style="color:rgb(204,120,50)">;<br></span><span style="color:rgb(204,120,50)"> </span>webSocketChannel.addCloseTask(channel -> {<br> System.<span style="color:rgb(152,118,170);font-style:italic">out</span>.println(<span style="color:rgb(106,135,89)">"Closing"</span>)<span style="color:rgb(204,120,50)">;</span><span style="color:rgb(204,120,50)"><br></span><span style="color:rgb(204,120,50)"> </span>})<span style="color:rgb(204,120,50)">;<br></span><span style="color:rgb(204,120,50)"> </span>}<br><br> <span style="color:rgb(187,181,41)">@Override<br></span><span style="color:rgb(187,181,41)"> </span><span style="color:rgb(204,120,50)">protected void </span><span style="color:rgb(255,198,109)">onFullTextMessage</span>(WebSocketChannel channel<span style="color:rgb(204,120,50)">, </span>BufferedTextMessage message) {<br> System.<span style="color:rgb(152,118,170);font-style:italic">out</span>.println(<span style="color:rgb(106,135,89)">"onFullTextMessage"</span>)<span style="color:rgb(204,120,50)">;
</span><span style="font-size:10.5pt;color:rgb(204,120,50)"> super</span><span style="font-size:10.5pt">.onFullTexMessage(channel, message</span><span style="font-size:10.5pt">)</span><span style="font-size:10.5pt;color:rgb(204,120,50)">;</span><span style="color:rgb(204,120,50)"><br></span><span style="color:rgb(204,120,50)"> </span>}<br><br> <span style="color:rgb(187,181,41)">@Override<br></span><span style="color:rgb(187,181,41)"> </span><span style="color:rgb(204,120,50)">protected void </span><span style="color:rgb(255,198,109)">onError</span>(WebSocketChannel channel<span style="color:rgb(204,120,50)">, </span>Throwable error) {<br> System.<span style="color:rgb(152,118,170);font-style:italic">out</span>.println(<span style="color:rgb(106,135,89)">"error"</span>)<span style="color:rgb(204,120,50)">;<br></span><span style="color:rgb(204,120,50)"> super</span>.onError(channel<span style="color:rgb(204,120,50)">, </span>error)<span style="color:rgb(204,120,50)">;<br></span><span style="color:rgb(204,120,50)"> </span>}<br><br> <span style="color:rgb(187,181,41)">@Override<br></span><span style="color:rgb(187,181,41)"> </span><span style="color:rgb(204,120,50)">protected void </span><span style="color:rgb(255,198,109)">onClose</span>(WebSocketChannel webSocketChannel<span style="color:rgb(204,120,50)">, </span>StreamSourceFrameChannel channel)<br> <span style="color:rgb(204,120,50)">throws </span>IOException {<br> System.<span style="color:rgb(152,118,170);font-style:italic">out</span>.println(<span style="color:rgb(106,135,89)">"onClose"</span>)<span style="color:rgb(204,120,50)">;</span><span style="color:rgb(204,120,50)"><br></span><span style="color:rgb(204,120,50)"> super</span>.onClose(webSocketChannel<span style="color:rgb(204,120,50)">, </span>channel)<span style="color:rgb(204,120,50)">;<br></span><span style="color:rgb(204,120,50)"> </span>}<br><br> <span style="color:rgb(187,181,41)">@Override<br></span><span style="color:rgb(187,181,41)"> </span><span style="color:rgb(204,120,50)">protected void </span><span style="color:rgb(255,198,109)">onFullCloseMessage</span>(WebSocketChannel channel<span style="color:rgb(204,120,50)">, </span>BufferedBinaryMessage message)<br> <span style="color:rgb(204,120,50)">throws </span>IOException {<br> System.<span style="color:rgb(152,118,170);font-style:italic">out</span>.println(<span style="color:rgb(106,135,89)">"onFullCloseMessage"</span>)<span style="color:rgb(204,120,50)">;</span><span style="color:rgb(204,120,50)"><br></span><span style="color:rgb(204,120,50)"> super</span>.onFullCloseMessage(channel<span style="color:rgb(204,120,50)">, </span>message)<span style="color:rgb(204,120,50)">;<br></span><span style="color:rgb(204,120,50)"> </span>}<br><br> <span style="color:rgb(187,181,41)">@Override<br></span><span style="color:rgb(187,181,41)"> </span><span style="color:rgb(204,120,50)">protected void </span><span style="color:rgb(255,198,109)">onCloseMessage</span>(CloseMessage cm<span style="color:rgb(204,120,50)">, </span>WebSocketChannel channel) {<br> System.<span style="color:rgb(152,118,170);font-style:italic">out</span>.println(<span style="color:rgb(106,135,89)">"onCloseMessage"</span>)<span style="color:rgb(204,120,50)">;</span><span style="color:rgb(204,120,50)"><br></span><span style="color:rgb(204,120,50)"> super</span>.onCloseMessage(cm<span style="color:rgb(204,120,50)">, </span>channel)<span style="color:rgb(204,120,50)">;<br></span><span style="color:rgb(204,120,50)"> </span>}<br>}</font></pre></div><div><br></div></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr"><div><span style="color:rgb(85,85,85);font-family:sans-serif;font-size:13px;line-height:19px;background-color:rgb(255,255,255);border-width:2px 0px 0px;border-style:solid;border-color:rgb(51,105,232);padding-top:2px;margin-top:2px"> Robin Anil |</span><span style="color:rgb(85,85,85);font-family:sans-serif;font-size:13px;line-height:19px;background-color:rgb(255,255,255);border-width:2px 0px 0px;border-style:solid;border-color:rgb(238,178,17);padding-top:2px;margin-top:2px"> Software Engineer</span></div></div></div></div>
<br><div class="gmail_quote">On Sun, Nov 22, 2015 at 3:07 PM, Stuart Douglas <span dir="ltr"><<a href="mailto:sdouglas@redhat.com" target="_blank">sdouglas@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">@OnError should be called if @OnClose is not called (if neither is being called this is a bug).<br>
<br>
Stuart<br>
<span class=""><br>
----- Original Message -----<br>
> From: "Dennis Gesker" <<a href="mailto:dennis@gesker.com">dennis@gesker.com</a>><br>
> To: "Robin Anil" <<a href="mailto:robin.anil@gmail.com">robin.anil@gmail.com</a>><br>
> Cc: <a href="mailto:undertow-dev@lists.jboss.org">undertow-dev@lists.jboss.org</a><br>
> Sent: Saturday, 21 November, 2015 3:51:31 AM<br>
> Subject: Re: [undertow-dev] Correctly shutting down a websocket handler<br>
><br>
> Hi Robin:<br>
><br>
> I'm new to WebSockets but I'm glad to share what has been working for me. My<br>
> use cases are currently via Java SE not the Web so this may not apply. I'm<br>
> migrating a bunch of data from an old system and really just pounding on<br>
> Undertow to see how it will behave when I'm ready to build my production<br>
> application. And, I in no way claim this is a best practice. But, maybe you<br>
> will find it useful.<br>
><br>
> Anyway, I add three additional methods to each of my deocorated websockets<br>
> (clients) two of which I call from other objects as needed. With this<br>
> approach I'm not seeing any data loss. Seem to be getting timely responses<br>
> from the server side WebSocket. And, always get a nice clean [1000] close<br>
> codes.<br>
><br>
> setup()<br>
> tearDown()<br>
> sendWorktoServer()<br>
><br>
><br>
> public void sendWorkToServer(Object obj) {<br>
</span>> // <a href="http://logger.info" rel="noreferrer" target="_blank">logger.info</a> (this.getClass().getSimpleName() + " >>> Enter<br>
<span class="">> sendWorkToServer");<br>
><br>
> if (webSocketSession == null || !webSocketSession.isOpen()) {<br>
> setUp();<br>
> }<br>
><br>
> if (obj == null || obj.getId() == null || obj.getId().isEmpty()) {<br>
> return;<br>
> }<br>
><br>
> ObjectMapper mapper = new ObjectMapper();<br>
> String json = null;<br>
><br>
><br>
><br>
> try {<br>
> json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);<br>
> <a href="http://logger.info" rel="noreferrer" target="_blank">logger.info</a> (json);<br>
> webSocketSession.getAsyncRemote().sendText(json);<br>
> //messageLatch.await(500, TimeUnit.MILLISECONDS);<br>
> } catch (JsonProcessingException e) {<br>
> e.printStackTrace();<br>
> }<br>
><br>
><br>
</span>> <a href="http://logger.info" rel="noreferrer" target="_blank">logger.info</a> ("Socket is open: " + webSocketSession.isOpen());<br>
> <a href="http://logger.info" rel="noreferrer" target="_blank">logger.info</a> ("Exit sendWorkToServer");<br>
<span class="">> }<br>
><br>
> private boolean setUp() { //Called if needed inside sendWorkToServer() method<br>
><br>
> try {<br>
> websocketServerURI = serverSocketURI.getAddCfgStructureWsUri(); // Get<br>
> Correct URI Development vs Production<br>
</span>> <a href="http://logger.info" rel="noreferrer" target="_blank">logger.info</a> ("URI: " + websocketServerURI.toString());<br>
<div class="HOEnZb"><div class="h5">> webSocketContainer = ContainerProvider.getWebSocketContainer(); // WebSocket<br>
> Container<br>
> webSocketSession = webSocketContainer.connectToServer(this.getClass(),<br>
> websocketServerURI); // Connect to the Server<br>
> if (!webSocketSession.isOpen()) {<br>
> messageLatch.await(10, TimeUnit.SECONDS);<br>
> }<br>
><br>
> } catch (DeploymentException e) {<br>
> e.printStackTrace();<br>
> return false;<br>
> } catch (IOException e) {<br>
> e.printStackTrace();<br>
> return false;<br>
> } catch (InterruptedException e) {<br>
> e.printStackTrace();<br>
> }<br>
><br>
> return true;<br>
><br>
> }<br>
><br>
> public boolean tearDown() {<br>
><br>
> if (webSocketSession != null) {<br>
> if (webSocketSession.isOpen()) {<br>
> try {<br>
> webSocketSession.close();<br>
> } catch (IOException e) {<br>
> e.printStackTrace();<br>
> return false;<br>
> }<br>
> }<br>
> }<br>
> webSocketSession = null;<br>
> webSocketContainer = null;<br>
> websocketServerURI = null;<br>
> serverSocketURI = null;<br>
> return true;<br>
> }<br>
><br>
><br>
> So, inside my other object the code looks something like...<br>
><br>
> WebSocketClient wcs = new WebSocketClient();<br>
> wcs.sendWorkToServer(Object obj);<br>
> // More work and activities<br>
> wcs.teardown();<br>
> wcs = null;<br>
><br>
> Also, what might be helpful is to add a custom method that just return the<br>
> status of your websocketclient session and then call teardown() as needed.<br>
> I hope that helps a bit... In my scenario I take some extra steps to control<br>
> the life cycle so I don't really have to detect status.<br>
><br>
> Cordially,<br>
> Dennis<br>
><br>
><br>
><br>
><br>
><br>
><br>
><br>
> On Thu, Nov 19, 2015 at 1:12 PM, Robin Anil < <a href="mailto:robin.anil@gmail.com">robin.anil@gmail.com</a> > wrote:<br>
><br>
><br>
><br>
> When a client disconnects, I see that onClose is not being fired. The only<br>
> way this seems to be firing if client sents a close frame.<br>
><br>
> Is there any way to detect disconnection and immediately close all the opened<br>
> resources.<br>
><br>
> Robin<br>
><br>
> Robin Anil | Software Engineer<br>
><br>
> _______________________________________________<br>
> undertow-dev mailing list<br>
> <a href="mailto:undertow-dev@lists.jboss.org">undertow-dev@lists.jboss.org</a><br>
> <a href="https://lists.jboss.org/mailman/listinfo/undertow-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/undertow-dev</a><br>
><br>
><br>
><br>
> --<br>
><br>
</div></div><span class="im HOEnZb">> “Be without fear in the face of your enemies. Be brave and upright that God<br>
> may love thee. Speak the truth always, even if it leads to your death.<br>
> Safeguard the helpless and do no wrong – that is your oath.” -The Knight’s<br>
> Oath (Kingdom of Heaven)<br>
><br>
</span><div class="HOEnZb"><div class="h5">> _______________________________________________<br>
> undertow-dev mailing list<br>
> <a href="mailto:undertow-dev@lists.jboss.org">undertow-dev@lists.jboss.org</a><br>
> <a href="https://lists.jboss.org/mailman/listinfo/undertow-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/undertow-dev</a><br>
</div></div></blockquote></div><br></div>